主窗口上的更新标签
本文关键字:更新 标签 窗口 | 更新日期: 2023-09-27 17:52:33
我有一个WPF应用程序,我试图从另一个窗口更新我的WPF主窗口。
这是我的代码。
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"
我错过了什么
如果你想从另一个窗口对主窗口产生影响,这意味着另一个窗口对主窗口有依赖关系。
确保将MainWindow作为参数传递给另一个窗口的构造函数,并将此依赖关系存储在引用变量中。ie _MainWindow
然后,如果您希望此调用发生在与GUI线程不同的线程中,则可以稍后简单地使用该引用并使用分派器。
这是一个比使用任何结构(如:(MainWindow)System.Windows.Application.Current.MainWindow)
)要好得多的解决方案最好在主窗口上创建一个方法并调用该方法,而不是直接更新主窗口上的控件。这样更好,因为其他窗口不必知道主窗口的细节。更好的是,您可以为这个更新方法创建一个接口,而不是将完整的主窗口传递给传递接口的另一个窗口的构造函数。(参见下面的代码示例)
有更多的替代方案,比如生成事件,但是你必须为生成窗口的事件注册主窗口。您可以切换到MVVM,但这将导致更复杂的设计。我认为你还没有使用MVVM,否则你就不会问这个问题了。
哪种解决方案最好取决于具体情况。你的代码太小了,我们不能给你一个好的建议。
只是一些示例代码来帮助您开始它是远远不够的:
public interface IUpdateTrigger{
void updateNotification();
}
public class MainWindow : IUpdateTrigger{
public void updateNotification(){
//update controls, dispatch if needed
}
public void showSecondWindow(){
SecondWindow second = new SecondWindow(this);
//code to show the second window like second.show();
}
}
public class SecondWindow{
private IUpdateTrigger _UpdateTrigger;
public SecondWindow(IUpdateTrigger trigger){
_UpdateTrigger = trigger
}
public Whatevermethod(){
_UpdateTrigger.updateNotification();
}
}
简而言之,SomeLabel
对第二个窗口的调用是不可见的。长话短说,您可以创建一些public static
(或internal static
)方法来设置该Label
的值;它应该工作,即使它不是最优雅的解决方案(顺便说一句,最好使用TextBlock
控件而不是Label
)。希望这能有所帮助。最好的祝福,