【问题标题】:How to redirect events from a WPF UserControl to WinForm?如何将事件从 WPF UserControl 重定向到 WinForm?
【发布时间】:2011-05-02 07:48:04
【问题描述】:

我有一个带有 wpf 用户控件的 winform (ElementHost1)。用户控件只包含一个按钮。我如何知道何时在我的 winform 中单击了 wpf 按钮?如何将事件从 wpf 用户控件“重定向”到 winform?

谢谢。

【问题讨论】:

    标签: wpf vb.net wpf-controls


    【解决方案1】:

    这个link可能对你有帮助。

    或者VB.NET中的简单事件处理

    Public Event ClickMe()
    
    Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
        RaiseEvent ClickMe()
    End Sub
    

    然后在你的实际窗口中你可以有这个:

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler SampleClick1.ClickMe, AddressOf Sample_Click
    End Sub
    
    Private Sub Sample_Click()
        MessageBox.Show("This is a proof!")
    End Sub
    

    SampleClick1 变量来自生成的设计器代码,可用于表单供您使用。

    Friend WithEvents ElementHost1 As System.Windows.Forms.Integration.ElementHost
    Friend SampleClick1 As WindowsApplication1.SampleClick
    

    【讨论】:

    • 谢谢,但“处理 SampleClick1.ClickMe”部分不起作用。 “.ClickMe”不存在。我将第一个代码添加到 WPF,但它在 winform 中不公开。
    • 我的答案的第一部分必须放在你的用户控件中。第二部分是针对 WinForm 本身的。至少在我这端应该可以正常工作,因为我在将其发布到此处之前尝试了它。你想要 Xaml 吗?
    • 是的,请把 xaml 发给我 - 我做了一个简短的截屏视频,它表明它不适合我。也许我做错了什么:youtube.com/watch?v=nVdzDiR79GY - (对不起,它是德语,VStudio,但代码就是代码;)
    • 我编辑了代码,现在应该可以正常工作了,抱歉,我忘记了您正在使用 ElementHost 来运行 Winform。顺便说一句,您的截屏视频是正确的,您只需添加我在上面编辑的代码。 :)
    【解决方案2】:

    这是我找到的一个解决方案

    在 UserControl1.Xaml.cs 中

    public static RoutedEvent ChkBoxChecked = EventManager.RegisterRoutedEvent("CbChecked", RoutingStrategy.Bubble,
                                                                    typeof(RoutedEventHandler), typeof(CheckBox));
    public event RoutedEventHandler CbChecked
    {
        add
        {
            AddHandler(ChkBoxChecked, value);
        }
        remove
        {
            RemoveHandler(ChkBoxChecked, value);
        }
    }
    
    private void cbTreeView_Checked(object sender, RoutedEventArgs e)
    {
        RoutedEventArgs args = new RoutedEventArgs(ChkBoxChecked);
        RaiseEvent(args);                
    }
    

    现在在 MainForm Form1 显示的事件中我们可以添加 CbChecked 事件

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.elemetHost1.CbChecked += new System.Windows.RoutedEventHandler(wpfusercontrol_CbChecked);
        //elementHost1 is the name of wpf usercontrol hosted in Winform
    }
    
    void elementHost1_CbChecked(object sender, System.Windows.RoutedEventArgs e)
    {
        //This event will raise when user clicks on chekbox
    }
    

    我在这里遇到了一个问题。我在 Form1 中为 UserControl1 中的所有复选框单击事件发出相同的事件。所以我想知道在主窗体中单击了哪个复选框。我试图在 RoutedEventArgs e 中查看。 ...但没有帮助 如何知道主窗体中点击了哪个复选框

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多