Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新主窗口上的标签_C#_Wpf - Fatal编程技术网

C# 更新主窗口上的标签

C# 更新主窗口上的标签,c#,wpf,C#,Wpf,我有一个WPF应用程序,我试图从另一个窗口更新我的WPF主窗口 这是我的密码 main window.xaml <Label x:Name="SomeLabel" Content="Label" Margin="290,2,0,0" VerticalAlignment="Top" /> 然而,它在这一点上被打破。引发的异常是 “无效的强制转换异常无法将CallingWindow的对象强制转换为MainWindow” 我遗漏了什么?简而言之,第二个窗口中的调用看不到SomeL

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

这是我的密码

main window.xaml

   <Label x:Name="SomeLabel" Content="Label" Margin="290,2,0,0" VerticalAlignment="Top"  />
然而,它在这一点上被打破。引发的异常是

“无效的强制转换异常无法将CallingWindow的对象强制转换为MainWindow”


我遗漏了什么?

简而言之,第二个窗口中的调用看不到
SomeLabel
。长话短说,您可以创建一些
公共静态
(或
内部静态
)方法来设置该
标签的值
;即使它不是最优雅的解决方案,它也应该可以工作(顺便说一句,最好使用
TextBlock
控件而不是
Label
)。希望这能有所帮助。非常感谢,

简而言之,
SomeLabel
对于第二个窗口的调用不可见。长话短说,您可以创建一些
公共静态
(或
内部静态
)方法来设置该
标签的值
;即使它不是最优雅的解决方案,它也应该可以工作(顺便说一句,最好使用
TextBlock
控件而不是
Label
)。希望这能有所帮助。非常感谢,

简而言之,
SomeLabel
对于第二个窗口的调用不可见。长话短说,您可以创建一些
公共静态
(或
内部静态
)方法来设置该
标签的值
;即使它不是最优雅的解决方案,它也应该可以工作(顺便说一句,最好使用
TextBlock
控件而不是
Label
)。希望这能有所帮助。非常感谢,

简而言之,
SomeLabel
对于第二个窗口的调用不可见。长话短说,您可以创建一些
公共静态
(或
内部静态
)方法来设置该
标签的值
;即使它不是最优雅的解决方案,它也应该可以工作(顺便说一句,最好使用
TextBlock
控件而不是
Label
)。希望这能有所帮助。致以最诚挚的问候,

如果您希望从另一个窗口对主窗口产生影响,这意味着另一个窗口对主窗口具有依赖性。
确保将MainWindow作为参数传递给另一个窗口的构造函数,并将此依赖项存储在引用变量中。ie_主窗口
然后,如果希望此调用从不同于GUI线程的线程进行,您可以稍后简单地使用该引用并使用dispatcher。
这是一个比使用任何构造(如:
(MainWindow)System.Windows.Application.Current.MainWindow)要好得多的解决方案。
最好在MainWindow上创建一个方法并调用该方法,而不是直接更新MainWindow上的控件。这样更好,因为这样其他窗口就不必知道mainwindow的详细信息。 更好的是,您可以为此更新方法创建一个接口,而不是将完整的主窗口传递给另一个窗口的构造函数,而是传递该接口。(请参见下面的代码示例)

还有更多的替代方法,比如生成事件,但是您必须为生成窗口的事件注册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();
    }
}

如果您想从另一个窗口影响MainWindow,这意味着另一个窗口依赖于MainWindow。
确保将MainWindow作为参数传递给另一个窗口的构造函数,并将此依赖项存储在引用变量中。ie_主窗口
然后,如果希望此调用从不同于GUI线程的线程进行,您可以稍后简单地使用该引用并使用dispatcher。
这是一个比使用任何构造(如:
(MainWindow)System.Windows.Application.Current.MainWindow)要好得多的解决方案。
最好在MainWindow上创建一个方法并调用该方法,而不是直接更新MainWindow上的控件。这样更好,因为这样其他窗口就不必知道mainwindow的详细信息。 更好的是,您可以为此更新方法创建一个接口,而不是将完整的主窗口传递给另一个窗口的构造函数,而是传递该接口。(请参见下面的代码示例)

还有更多的替代方法,比如生成事件,但是您必须为生成窗口的事件注册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();
    }
}

如果您想从另一个窗口影响MainWindow,这意味着另一个窗口依赖于MainWindow。
确保将MainWindow作为参数传递给另一个窗口的构造函数,并将此依赖项存储在引用变量中。ie_主窗口
然后,如果希望此调用从不同于GUI线程的线程进行,您可以稍后简单地使用该引用并使用dispatcher。
这是一个比使用任何构造(如:
(MainWindow)System.Windows.Application.Current.MainWindow)要好得多的解决方案。
最好在MainWindow上创建一个方法并调用该方法,而不是直接更新MainWindow上的控件。这样更好,因为这样其他窗口就不必知道mainwindow的详细信息。 更好的是,您可以为此更新创建一个接口