WPF -父母是如何知道“已检查”的?子控件的事件复选框
本文关键字:控件 复选框 事件 已检查 检查 父母 何知道 WPF | 更新日期: 2023-09-27 17:53:12
我有一个子控件,它有一个复选框和一个web浏览器:
<UserControl x:Class="Some.MyUserControl" etc.>
<Grid>
<CheckBox x:Name="chkA" Content="Analysis" Checked="chkA_Checked"></CheckBox>
<WebBrowser Margin="0,30,0,0" Name="wbA"></WebBrowser>
</Grid>
</UserControl>
我把这个控件放在MainWindow.xaml/.cs:
<Window x:Class Some.MainWindow xmlns:local="clr-namespace:Some" etc.>
<Grid>
<local:MyUserControl x:Name="MyUserControl_Main"></local:MyUserControl>
</Grid>
</Window>
我的问题是我的主窗口如何知道复选框(chkA)已被选中?到目前为止,只有实际的用户控件知道它已被单击?如何让主窗口看到"Checked"事件?还是有更好的办法?
我已经在网上搜索过了,但似乎无法理解我所看到的。
提前谢谢你
新手
编辑1:
我正在尝试下面的方法,运气不好,但可能是正确的。
在我的mainwindow . example .cs中我添加了:
public static readonly RoutedEvent CheckedEvent = EventManager.RegisterRoutedEvent("Checked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
public event RoutedEventHandler Checked
{
add { AddHandler(CheckedEvent, value); }
remove { RemoveHandler(CheckedEvent, value); }
}
在MyUserControl.xaml.cs中我添加了:
private void chkA_Checked(object sender, RoutedEventArgs e)
{
RoutedEventArgs args = new RoutedEventArgs(MainWindow.CheckedEvent);
RaiseEvent(args);
}
编辑2:
将前面提到的代码移动到MyUserControl.xaml.cs:
public static readonly RoutedEvent CheckedEvent = EventManager.RegisterRoutedEvent("Checked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));
public event RoutedEventHandler Checked
{
add { AddHandler(CheckedEvent, value); }
remove { RemoveHandler(CheckedEvent, value); }
}
private void chkA_Checked(object sender, RoutedEventArgs e)
{
RoutedEventArgs args = new RoutedEventArgs(MainWindow.CheckedEvent);
RaiseEvent(args);
}
现在我可以看到"Checked"事件"Bubble" up如下:
<Window x:Class Some.MainWindow xmlns:local="clr-namespace:Some" etc.>
<Grid>
<local:MyUserControl x:Name="MyUserControl_Main" **Checked="MyUserControl_Main_Checked"**></local:MyUserControl>
</Grid>
</Window>
谢谢@Matt的提示!
编辑3:
Matt的第一个答案是最好的方法,我有"Checkbox"vs"Checkbox"…添加复选框。选中网格捕获事件:
让Checked
事件冒泡到父节点并在那里捕获它。这就是路由事件的美妙之处!
<Grid CheckBox.Checked="CheckBox_Checked">
<local:MyUserControl x:Name="MyUserControl_Main" />
</Grid>
您在正确的轨道上,但是您应该在MyUserControl
中声明路由事件,而不是在MainWindow
中…引发事件的是用户控件,而不是窗口。你这样做的方式,你的控制是显式地依赖于MainWindow
,这是不好的做法,没有必要。