【问题标题】:C# & WPF - Understanding windows & classes, & passing window as argument in methodC# & WPF - 理解窗口和类,并在方法中将窗口作为参数传递
【发布时间】:2014-03-31 22:29:12
【问题描述】:

新手问题!我有“MainWindow”和“EditSettings”,它们是类。据我所知,(如果有错误请纠正我)它们都是从 Window 类派生的类:

public partial class MainWindow : Window

当我真正想创建一个窗口时,我会创建一个派生类的实例,如下所示:

EditSettings winEditSettings = new EditSettings();

这意味着winEditSettings是EditSettings类的一个实例,它派生自Window。

如果我想编写一个接受我的任何窗口作为参数的方法,我会写什么作为参数?我最初有:

    protected void OpenWindowOnce(Window win)
    {
        //This method tells the user whether the window is already open or not
        foreach (Window n in Application.Current.Windows)
            if (n == win)
            {
                MessageBox.Show("The window is already open"); 
            }
            else
            { 
                MessageBox.Show("You have not opened that window yet");
                win.Show(); 
            }

似乎语句的 IF 部分不起作用 - 它一直告诉我窗口尚未打开,然后打开它的新版本。我调用方法如下:

    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        EditSettings winEditSettings = new EditSettings();
        OpenWindowOnce(winEditSettings);
    }

到目前为止,这就是我的程序中的全部内容 - 我只是想编写一种方法来防止窗口被多次打开。运行这段代码给了我:

“你还没有打开那个窗口” --> 窗口“winEditSettings”被打开了。

如果我再次按下按钮,我会收到两条消息,说“你还没有打开那个窗口”,它会打开另一个 winEditSettings 实例。

编辑

如何重写我的 OpenWindowOnce 方法以接受任何窗口类的任何实例?我希望能够将 winEditSettings、winMainWindow 或 winAbout 作为参数传递。

【问题讨论】:

  • 我相信我的 OpenWindowOnce 方法不起作用,因为它试图将 Window 的实例作为参数传递,而我正在给它一个 EditSettings 的实例。我可以重写方法,让它接受我的任何窗口作为参数吗?

标签: c# wpf class xaml window


【解决方案1】:

由于您将实例传递给您的方法,因此您必须传递已打开窗口的实例以查看它是否已打开。

否则,请尝试比较它们的类型:

void ShowWindowOnce(Window window)
{
    foreach (Window n in Application.Current.Windows)
    {
        if (typeof(n) == typeof(window)
        {
            // A window with the given type is opened, no need to show another one so return
            return;
        }
    }

    // No open form with that type was open, show it
    window.Show();
}

【讨论】:

    【解决方案2】:

    您将实例化的Window 传递给您的方法,因此您需要知道窗口是否已加载。

        private void OpenOnce(Window win)
        {
            foreach (Window n in Application.Current.Windows)
            {
                if (n.GetType() == win.GetType())
                {
                    if (n.IsLoaded)
                    {
                        MessageBox.Show("The window is already open");
                        return;
                    }
                }
            }
    
            win.Show();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多