【问题标题】:how to reference the parent form from the WPF control如何从 WPF 控件引用父窗体
【发布时间】:2010-12-20 10:24:55
【问题描述】:

我正在使用 elementhost 在 Windows 窗体中托管 WPF 用户控件。我想知道如何在 WPF 控件中引用父窗体。

【问题讨论】:

    标签: wpf winforms


    【解决方案1】:

    这是一种方法,在 WPF UserControl 中有一个按钮:

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            var source = (HwndSource)PresentationSource.FromDependencyObject(button1);
            var host = (Forms.Integration.ElementHost)Forms.Control.FromChildHandle(source.Handle);
            var form = (Forms.Form)host.TopLevelControl;
            // Show form title
            MessageBox.Show(form.Text);
        }
    

    (在此代码中FormsSystem.Windows.Forms 的别名)

    【讨论】:

    • 请客,谢谢。不过我会检查空值。
    【解决方案2】:

    为什么不以编程方式创建这种关系?即,当您将 WPF 用户控件添加到元素宿主中时,将用户控件的 Tag 属性设置为元素宿主实例。

    科林 E.

    【讨论】:

    • 感谢您为我指明正确的方向!在阅读了所有这些关于如何利用命令或事件来处理应该如此简单的事情的建议之后,我最终只是将父窗体的一个空变量放在用户控件中并将其设置为空。每次创建用户控件的实例时,我都会将变量设置为创建窗口。简单!
    【解决方案3】:

    我建议你

    • 公开来自WPF child control的事件,
    • 在创建事件时从父事件注册到该事件,
    • 只要您想要来自子控件的数据,就引发该事件,
    • 通过在自定义EventArgs对象中设置值使父控件返回数据。

    除非在某些特殊情况下,否则应避免访问父控件。当想要设置从子到父的通信时,始终将事件从子容器传播到父容器。

    【讨论】:

    • 您能否给出更详细的原因,为什么不“除非在某些特殊情况下,应避免访问父控件”
    • 这听起来很有希望,你能给我一个链接或简单的例子来说明你的意思吗?公开一个事件(我认为你的意思是一个自定义事件处理程序?)并向父级注册它?所以我猜这意味着你在 InitializeComponent 阶段注册了事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2021-12-09
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多