如何通过子用户控件的Closed路由事件控制父窗体其他控件显隐
方案1:直接订阅头部控件的Closed事件
如果你的MainHeaderView直接在父窗体的XAML中定义,给控件添加x:Name标识后直接订阅即可:
- 父窗体XAML示例:
<local:MainHeaderView x:Name="GlobalHeader" /> <!-- 你的两个业务控件 --> <local:MineControl x:Name="MineView" /> <local:MessageControl x:Name="MessageView" Visibility="Collapsed" />
- 父窗体代码后置添加订阅逻辑:
public 父窗体类名() { InitializeComponent(); // 订阅头部关闭事件 GlobalHeader.Closed += GlobalHeader_Closed; } private void GlobalHeader_Closed(object sender, RoutedEventArgs e) { MineView.Visibility = Visibility.Collapsed; MessageView.Visibility = Visibility.Visible; // 若不需要事件继续向上冒泡可标记已处理 e.Handled = true; }
方案2:监听冒泡路由事件(适合头部嵌在多层子控件的场景)
因为你定义的ClosedEvent是冒泡策略的路由事件,即使MainHeaderView嵌在mainc UserControl内部,父窗体不需要获取头部控件实例,直接监听路由事件即可:
public 父窗体类名() { InitializeComponent(); // 直接监听所有冒泡到当前窗体的MainHeaderView.Closed事件 this.AddHandler(MainHeaderView.ClosedEvent, new RoutedEventHandler(GlobalHeader_Closed)); } private void GlobalHeader_Closed(object sender, RoutedEventArgs e) { MineView.Visibility = Visibility.Collapsed; MessageView.Visibility = Visibility.Visible; e.Handled = true; }
注意事项
如果你已经在mine控件中订阅了该事件,需要确保mine控件的事件处理方法中没有设置e.Handled = true,否则事件会被中断冒泡,父窗体无法收到触发通知。
内容的提问来源于stack exchange,提问作者vahid
相关产品推荐
相关产品推荐

