更新MainWindow上的标签

时间:2015-06-01 18:37:06

标签: c# wpf

我有一个WPF应用程序,我试图从另一个窗口更新我的wpf MainWindow。

这是我的代码。

MainWindow.xaml

   <Label x:Name="SomeLabel" Content="Label" Margin="290,2,0,0" VerticalAlignment="Top"  />

CallingWindow.xaml.cs

     Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
                {    ((MainWindow)System.Windows.Application.Current.MainWindow).SomeLabel.Content ="Some Content";                        

                }));

然而,它正在突破。提出的例外是

"Invalid Cast exception cannot cast object of CallingWindow to MainWindow"

我想念的是什么?

2 个答案:

答案 0 :(得分:3)

如果你想从另一个窗口影响MainWindow,那意味着另一个窗口对MainWindow有依赖性。
确保将MainWindow作为参数传递给另一个窗口的构造函数,并将此依赖项存储在引用变量中。即_MainWindow
然后您可以稍后使用该引用并使用调度程序,如果您希望此调用发生在与GUI线程不同的线程中。
这是比使用任何构造更好的解决方案:40:25:36 最好在MainWindow上创建一个方法并调用该方法,而不是直接更新mainwindow上的控件。这样更好,因为其他窗口不必知道主窗口的细节。 更好的是,您可以为此更新方法创建一个接口,而不是将完整的主窗口传递给您传递接口的另一个窗口的构造函数。(参见下面的代码示例)

还有更多选择,例如生成事件,但是您必须为生成窗口的事件注册mainwindow。您可以转移到MVVM,但这将使更复杂的设计。我认为你还没有使用MVVM,或者你不会问这个问题。;-)。

哪种解决方案最好取决于具体情况。您的代码非常小,我们可以就此提出好的建议 只是一些示例代码可以帮助您入手:

(MainWindow)System.Windows.Application.Current.MainWindow)

答案 1 :(得分:0)

简而言之,第二个窗口的调用看不到SomeLabel。长话短说,您可以创建一些public static(或internal static)方法来设置Label的值;它应该工作,即使它不是最优雅的解决方案(顺便说一下,使用TextBlock控件而不是Label更好。)希望这可能有所帮助。最好的问候,