我有一个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"
我想念的是什么?
答案 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
更好。)希望这可能有所帮助。最好的问候,