我需要从另一个窗口的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'.'
答案 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();
}
}