#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 …. но не помогает
как узнать, какой флажок установлен в основной форме