WPF无模式子窗口Visibility属性DataTrigger不生效该如何解决?
根因说明
这是WPF依赖属性优先级机制导致的问题:调用win.Show()打开窗口时,该方法会本地赋值将窗口的Visibility属性设为Visible,在WPF的依赖属性优先级排序中,本地赋值的优先级远高于样式触发器(Style Trigger)的赋值优先级,因此样式Trigger里对Visibility的修改会被本地值覆盖,无法生效。而Background属性没有做过本地赋值,完全由样式控制,所以Trigger修改可以正常生效。
解决方案
方案1:使用SetCurrentValue替代Show()方法打开窗口
创建窗口实例后,不要调用win.Show(),改用SetCurrentValue设置显示状态,该方法只会修改属性值,不会将属性的优先级源标记为本地赋值,后续样式触发器可以正常覆盖该值:
Win_1 win = new Win_1(); // 不要调用win.Show() win.SetCurrentValue(VisibilityProperty, Visibility.Visible);
方案2:清除Visibility的本地赋值,完全交给样式管理
在窗口的ContentRendered事件中调用ClearValue清除本地赋值,让Visibility属性完全由样式逻辑控制:
private void Window_ContentRendered(object sender, EventArgs e) { bt_1.Focus(); // 清除Visibility的本地赋值,释放控制权给样式 ClearValue(VisibilityProperty); }
调整后样式中Trigger对Visibility的赋值即可正常生效。
内容的提问来源于stack exchange,提问作者Pollitzer
相关产品推荐
相关产品推荐

