【问题标题】:Having Trouble Setting Window's Owner in Parent's Constructor在父构造函数中设置窗口所有者时遇到问题
【发布时间】:2013-05-09 04:09:35
【问题描述】:

在 WPF 中将窗口的 Owner 属性设置为其父级构造函数中的父级是否有任何问题?应该没有吧?那么为什么我会从以下代码中得到XamlParseException

public partial class MainView : Window
{
    private readonly OwnedWindow owned;

    public MainView()
    {
        InitializeComponent();
        owned = new OwnedWindow();

        owned.DataContext = DataContext;

        var window = GetWindow(this);
        owned.Owner = this;  //Setting to window causes the same error

        ...
    }

我应该澄清一下,删除 owned.Owner = this; 也会删除运行时错误。

异常详情:

XamlParseException 未处理

在匹配的“...MainView”类型上调用构造函数 指定的绑定约束引发了异常。

实际上,我查看了 Inner Exception,它说:

无法将 Owner 属性设置为未显示的窗口 以前。

所以我现在正在调查。

【问题讨论】:

  • 您能发布 XamlParseException 的详细信息吗?

标签: c# wpf .net-4.0 window


【解决方案1】:

问题在于,因为 WPF 仅在 WPF 窗口第一次显示时创建本机窗口,所以您不能将尚未显示的窗口设置为 Owner(因为它建立了本机窗口“所有者-> 拥有”关系,但本机句柄尚不存在。)

您可以在所有者窗口上处理StateChanged 事件,确保新状态为“显示”,然后在该点设置拥有窗口的Owner。或者,您可以创建并显示此时拥有的窗口。

【讨论】:

  • 好的,那么我如何确保调用了OnStateChanged(例如“新状态为'显示'”)?
  • StateChanged 是一个事件,因此您可以在构造函数中订阅该事件,然后在处理程序中取消订阅(因为您只需设置一次Owner 属性。)
  • 取消订阅是个好主意。但我要说的是,我的窗口状态在构造函数之后并没有像我需要的那样改变。该方法仅在最小化或最大化时被调用。
  • @Joseph 啊,我明白了。在这种情况下,您可能只想在构造函数的主窗口中调用Show()
  • 哈哈,我也试过了。我什至试过Hide(); Show();,但也没有用。我发布了最终奏效的方法。感谢您的帮助!
【解决方案2】:

我最终订阅了Window.Activated,而不是Window.StateChanged。请务必按照 cmets 中的建议在处理程序中取消订阅。

    private void OnActivated(object sender, EventArgs eventArgs)
    {
        owned.Owner = this;
        Activated -= OnActivated;
    }

我接受了 dlev 的回答,因为它直接引导我找到了答案,即使他并不适合我的确切情况。

【讨论】:

    【解决方案3】:

    您需要 HandleCreated 事件的 WPF 等效项,即 SourceInitialized。这应该有效:

    public OwnerWindow()
    {
        InitializeComponent();
    
        SourceInitialized += (s, a) =>
            {
                var owned = new OwnedWindow();
                owned.Owner = this;
            };
    }
    

    请注意,您不必Show OwnerWindow 或 OwnedWindow 即可工作。

    【讨论】:

      【解决方案4】:

      如果您出于某种原因需要比正常情况更早创建的句柄,或者无法显示窗口,只需添加另一个选项:

      new WindowInteropHelper(myWindow).EnsureHandle();

      【讨论】:

        猜你喜欢
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        相关资源
        最近更新 更多