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"…添加复选框。选中网格捕获事件:

WPF -父母是如何知道“已检查”的?子控件的事件复选框

Checked事件冒泡到父节点并在那里捕获它。这就是路由事件的美妙之处!

<Grid CheckBox.Checked="CheckBox_Checked">
    <local:MyUserControl x:Name="MyUserControl_Main" />
</Grid>

您在正确的轨道上,但是您应该在MyUserControl中声明路由事件,而不是在MainWindow中…引发事件的是用户控件,而不是窗口。你这样做的方式,你的控制是显式地依赖于MainWindow,这是不好的做法,没有必要。