Как перенаправить события из WPF UserControl в WinForm?

#wpf #vb.net #wpf-controls

#wpf #vb.net #wpf-элементы управления

Вопрос:

У меня есть winform с wpf usercontrol на нем (ElementHost1). Пользовательский элемент управления содержит только кнопку. Как я могу узнать, когда была нажата кнопка wpf в моей winform? Как я могу «перенаправить» события из wpf usercontrol в winform?

Спасибо.

Ответ №1:

Эта ссылка может быть вам полезна.

Или простая обработка событий в 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
  

Комментарии:

1. спасибо, но часть «Обрабатывает SampleClick1.ClickMe» не работает. «.ClickMe» там отсутствует. Я добавил первый код в WPF, но он не является общедоступным в winform.

2. Первая часть моего ответа должна быть помещена в ваш пользовательский интерфейс. Вторая часть предназначена для самой WinForm. Это должно работать нормально, по крайней мере, с моей стороны, потому что я пробую это перед публикацией здесь. Вам нужен Xaml для этого?

3. да, пожалуйста, пришлите мне xaml — я сделал короткий скринкаст, он показывает, что у меня это не работает. возможно, я делаю что-то неправильно: youtube.com/watch?v=nVdzDiR79GY — (извините, это на немецком, VStudio, но код есть код 😉

4. Я отредактировал код, теперь он должен работать нормально, извините, я забыл, что вы используете 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.so я хочу знать, какой флажок установлен в основной форме. я пытался посмотреть в RoutedEventArgs e …. но не помогает
как узнать, какой флажок установлен в основной форме