如何从另一个窗口调用MainWindow方法?

时间:2019-08-06 09:44:34

标签: c# wpf xaml

我需要从另一个窗口的MainWindow中调用一个方法。 问题是我不知道为什么会出错,我想修复它。

我试图用各种方法来称呼功能,但没有一个起作用。 这是我最后的尝试:

我想称呼什么

namespace Class1
{
    public partial class MainWindow : Window
    {
        ...
        public void SkipVideo()
        {
            ...
        }
    }
}

这是我尝试致电的方式:

namespace Class1
{
    public partial class TimeWindow : Window
    {
        ...
        private void DemoVideo_MediaEnded(object sender, RoutedEventArgs e)
        {
            ((MainWindow)Application.Current.MainWindow).SkipVideo();
        }
    }
}

没有构建错误,但是当我运行程序时,它会执行以下操作: System.InvalidCastException: 'Unable to cast object of type 'Class1.TimeWindow' to type 'Class1.MainWindow'.'

3 个答案:

答案 0 :(得分:0)

需要将TimeWindow实例的引用交给mainWindow实例,以调用mainWindow.SkipVideo()。通常是在TimeWindow中创建mainWindow的地方。可以使用TimeWindow中的公共属性或Cosntructor Argument来提交实例。

但是您正在使用WPF,这是Windows窗体编程方法。 WPF / UWP设计时考虑了MVVM模式。这不是MVVM模式。尽管可以使用较旧的方法,但这样做会浪费WPF的90%左右的能力,并在其他每个角落都遇到问题。如果您打算在WPF中工作,则肯定需要学习MVVM。 MVVM包括这样一种在Windows之间共享数据/功能的方法。

几年前,我确实对MVVM进行了介绍:https://social.msdn.microsoft.com/Forums/vstudio/en-US/b1a8bf14-4acd-4d77-9df8-bdb95b02dbe2/lets-talk-about-mvvm?forum=wpf但是我不得不承认,我对如何通过ViewModel播放具有操纵选项的视频的理解超出了我的理解,因此纯MVVM可能不会在这种情况下是个好主意。否则预制控件可能会更好。

答案 1 :(得分:0)

InvalidCastException表示应用程序的主窗口是TimeWindow

假设实际上有一个MainWindow打开,您可以像这样获得对它的引用:

private void DemoVideo_MediaEnded(object sender, RoutedEventArgs e)
{
    MainWindow mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
    if (mainWindow != null)
        mainWindow.SkipVideo();
}

有更好的方法来处理此问题,例如使用@Christopher建议的MVVM设计模式,但这可能是当前设置中最简单的方法。

答案 2 :(得分:0)

-只需在MainWindow类中执行以下代码:

    public partial class MainWindow : Window
    {
            public static MainWindow _instance;
            public MainWindow()
            {
                _instance = this;
                InitializeComponent();
            }
private void SkipVideo()
{

}
    }

-现在您可以调用任何方法,用户控件等。

public partial class TimeWindow : Window
{
    ...
    private void DemoVideo_MediaEnded(object sender, RoutedEventArgs e)
    {
        MainWindow._instance.SkipVideo();
    }
}