主窗口上的更新标签

本文关键字:更新 标签 窗口 | 更新日期: 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)。希望这能有所帮助。最好的祝福,