【问题标题】:Is this an efficient way of finding and assigning the owner of a window in WPF?这是在 WPF 中查找和分配窗口所有者的有效方法吗?
【发布时间】:2013-12-03 22:03:08
【问题描述】:

这是我现在做的方式,但我不确定它是否效率低,因为运行时间是 O(n):

foreach (Window window in Application.Current.Windows)
{
    if (window.GetType() == typeof(TransactionsWindow))
    {
        this.Owner = window;
    }
}

有没有办法让它保持不变或更有效的方法?基本上,我试图确认我是否以正确的方式做事——一直在努力改进。窗口被按钮事件打开,所以我想知道是否有办法找出从哪个窗口调用事件并将该窗口分配为所有者,而不必搜索所有打开的窗口并硬编码所有者类型。

【问题讨论】:

  • 或者直接写Owner = Application.Current.Windows.OfType<TransactionsWindow>().FirstOrDefault();
  • 哇!这绝对比用break; 编写foreach 循环要短。 Linq 很棒。
  • 使用这个通常是不好的做法,但不是出于性能原因,而是因为它会创建脆弱的代码。
  • @Servy 哪一个,我发布的代码还是 Clemens?你所说的“脆弱代码”是什么意思?
  • @Noobacode 两者;一般使用Application.Current.Windows。从概念上讲,您只是试图通过查看所有窗口来弥补您“丢失”窗口正确所有者的事实。所有者应该在创建时设置,而不是在任何地方。

标签: c# wpf window owner


【解决方案1】:

这很好。如果您打开了足够多的窗口,这里的 O(N) 是一个问题,那么您的实际问题比这个循环要大得多。

也就是说,您不妨在if 中添加一个break;。此外,对于执行 theTransactionsWindow.Show() 的 Windows 来说,同时设置 theTransactionsWindow.Owner = this 可能会更好

【讨论】:

  • 嗯,你说得对……我没想到。出于某种原因,我认为它会通过所有应用程序窗口。相反,它是当前打开的窗口。我什至提到这是原始帖子中打开的窗户......需要更多咖啡。
  • break; 是个好主意。至于 .owner = this.... 你的意思是试图显示这个窗口的窗口是应该设置它的所有者的窗口,而不是我试图在窗口本身的代码隐藏中设置它?
  • 是的,所有者直接将自己设置为所有者会更有效
【解决方案2】:

与其循环通过窗口,不如在按钮单击事件中使用 Source 属性 RoutedEventArgs 变量来查找发出调用的 实际 按钮,然后是窗口,这可能是一种更简洁的解决方案该按钮的所有者。如下所示:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        Button btn = e.Source as Button;
        if (btn == null)
            return;

        Window parentWindow = Window.GetWindow(btn);
        this.Owner = parentWindow;
    }

【讨论】:

  • 不会将窗口设置为自己的父窗口吗?
  • 这将是从哪个窗口调用事件,这就是我认为你的问题说你正在寻找的,如果我误解了我很抱歉
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2013-08-11
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多