我有一个带有复选框和webbrowser的子控件:
<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>
我的问题是我的MainWindow怎么知道CheckBox(chkA)已被检查过?到目前为止,只有实际的用户控件知道它已被点击?如何为MainWindow公开“Checked”事件?或者有更好的方法吗?
我在网上搜索过,但似乎无法绕过我所看到的内容。
提前谢谢你,
-newb
编辑1:
我正在尝试以下但没有运气,但可能会走上正轨。
在我的MainWindow.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); }
}
在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”事件“冒泡”了:
<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”...将CheckBox.Checked添加到网格捕获事件:
答案 0 :(得分:3)
让Checked
事件冒泡到父母并抓住它。这是路线事件的美丽!
<Grid CheckBox.Checked="CheckBox_Checked">
<local:MyUserControl x:Name="MyUserControl_Main" />
</Grid>
答案 1 :(得分:0)
你走在正确的轨道上,但是你应该在MyUserControl
中声明路由事件,而不是MainWindow
...这是提升事件的用户控件,而不是窗口。你这样做的方式,你的控制权明确取决于MainWindow
,这是不好的做法而且没有必要。