【问题标题】:How to use a delegate between a Winforms Form and a WPF Usercontrol hosted by an elementhost in the Winforms form?如何在 Winforms 表单和由 Winforms 表单中的 elementhost 托管的 WPF 用户控件之间使用委托?
【发布时间】:2020-02-14 13:42:32
【问题描述】:

我有一个 Winforms 应用程序(例如名为 Form_WinForms 的类),我想向它添加一个 elementhost 控件,以便托管一个 WPF 用户控件(名为 Form_WPF)。

但我不知道如何处理它们之间的委托:我想与 Form_WinForms 中的 Form_WPF 控件进行交换,反之亦然。我该怎么办?谢谢

在示例中,我只想通过单击 Winforms 按钮内部来修改控件文本框(WPF 技术)的文本。

在 Winforms 类中:

// In Form_WinForms (my main form)

private void btn_Debug_Click(object sender, EventArgs e)
{
    // Form_WPF.GetInstance().Invoke(new ChangeTextBox_WPF(Form_WPF._ChangeTextBox_WPF), Form_WPF.GetInstance().TextBoxDebug, "test"); // what I would have done if Form_WPF was a WinForms form 
    Form_WPF.GetInstance().Dispatcher.Invoke(new ChangeTextBox_WPF(Form_WPF._ChangeTextBox_WPF), Form_WPF.GetInstance().TextBoxDebug, "test");
}

在 WPF 类中:

// In the Usercontrol Form_WPF (which is hosted by an elementhost in Winforms)

private delegate void ChangeTextBox_WPF(System.Windows.Controls.TextBox TextBox, String texte);
public static void _ChangeTextBox_WPF(System.Windows.Controls.TextBox TextBox, String texte) { TextBox.Text = texte; TextBox.Tag = texte; }

private static Form_WPF _Form_WPF;

public static Form_WPF GetInstance()
{
    if (_Form_WPF == null)
    {
        _Form_WPF = new Form_WPF();
    }
    return _Form_WPF;
}

【问题讨论】:

    标签: c# wpf winforms delegates elementhost


    【解决方案1】:

    ElementHostChild 属性转换为您的WPF 控件类型,例如:

    Form_WPF wpfControl = elementHost.Host as Form_WPF;
    

    然后您可以照常访问托管实例的任何成员。

    【讨论】:

    • 嗨,我的 elementhost 的 child 属性已经是 Form_WPF,当我按下 Winforms 调试按钮时,委托函数 _ChangeTextBox_WPF 正在触发,但是 WPF 文本框的文本没有改变
    • 可能是因为您设置了错误实例的Text 属性。删除所有静态的东西。你不需要它。
    • 如果我删除它,Form_WPF.GetInstance().Dispatcher.Invoke(new ChangeTextBox_WPF(Form_WPF._ChangeTextBox_WPF), Form_WPF.GetInstance().TextBoxDebug, "test"); 行出现以下错误:“非静态字段、方法或属性 'Form_WPF.GetInstance() 需要对象引用”跨度>
    • 删除该行并尝试我的示例代码?同样,您应该强制转换承载 WPF 控件的ElementHost 控件的Child 属性。
    • 如果您还有其他问题,请提出新问题。避免在 cmets 中进行长时间的讨论。
    猜你喜欢
    • 2012-03-27
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多