【问题标题】:Child(wpf usercontrol) calling a function from Parent(winForm)Child(wpf usercontrol) 从 Parent(winForm) 调用函数
【发布时间】:2012-01-12 22:53:00
【问题描述】:

我有 Form1(父级),它有一个 elementHost(WPF 用户控件)。现在,我希望 WPF 用户控件从其父级调用函数或传递值/数据。就这么简单。

这是我正在使用的代码,但程序总是崩溃..

Form1:

public void samp()
{
 MessageBox.Show("Sample");
}

WPF 用户控件:

Form1 frm1 = new Form1();

public void test()
{
 frm1.samp();
}

孩子可以直接访问它的父母吗?

【问题讨论】:

  • “程序总是崩溃”?你遇到了什么错误?
  • 不,它不运行。我需要重新启动VS。它总是在任务管理器(进程)中提供 800,000K+
  • 我试图重现您所描述的问题:see this 但它似乎对我有用。也许您可以在某处上传您的解决方案?
  • 所以你使用 Form1 作为 wpf,我做的是一个 WindowForm..但是你的代码对我很好,但我认为它只调用一个函数而不传递数据或一些值,或者我只是遗漏了什么。等待生病上传,所以你可以看到。谢谢顺便说一句

标签: c# wpf user-controls


【解决方案1】:

这个程序不能工作!您在 Wpf 用户控件中创建一个新的 Form1。 Form1 包含这个用户控件...所以这是一个无限循环!

您必须将托管 WPF 用户控件的 elementhost 的 Parent 属性转换为 Form1,然后您可以调用您的函数,如下所示:

HwndSource wpfHandle = PresentationSource.FromVisual(this) as HwndSource;
if (wpfHandle != null)
{
    ElementHost host = System.Windows.Forms.Control.FromChildHandle(wpfHandle.Handle) as ElementHost;
    if (host != null)
    {
        Form1 form1 = host.Parent as Form1;
        if (form1 != null)
        {
            form1.samp();
        }
    }
}

【讨论】:

  • 取决于 Form1 的实例化发生的位置。如果它在 WPF UserControl (ElementHost.Child) 的构造函数中,那么它是无限的(因为在创建 Form1 时将创建一个新的 WPF USerControl 等等......)。当 WPF UserControl 上有一个按钮(OnClick)创建一个 Form1 并调用公共方法时,我没有看到问题......
  • 这不是一个无限循环。如果 void test() in is example 在初始化时被调用,那只会是一个无限循环,但它不是。
  • @JapsAsuncion:我已经根据您的评论编辑了我的答案。
  • @RonSijm 和 JoepGreuter:我们无法确定这是否是一个无限循环,因为我们没有看到整个代码。
  • 他在第一篇文章中发布了应该是“完整代码”的评论。这也不是一个无限循环。此外,无限循环不会使 Visual Studio 崩溃到桌面,但会导致 stackoverflow 或其他问题
【解决方案2】:

您必须将父级实例注入您的 WPF 控件。然后有了这个引用,你就可以用它来操作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 2014-05-02
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多