WPF中如何让组件样式动态响应窗口状态变化?
问题根源
你用Style里的普通Trigger绑定Window.WindowState,这种方式只会在按钮初始化的时候检查一次窗口状态,之后窗口状态再变化,触发器不会跟着响应——因为它没建立起对窗口状态动态变化的监听机制。
修复方案
换成DataTrigger,通过绑定实时监听窗口的WindowState属性,代码改成这样:
<Style TargetType="{x:Type Button}" x:Key="ScaleButton"> <!-- 你的其他样式设置 --> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=WindowState}" Value="Maximized"> <Setter Property="Visibility" Value="Hidden" /> </DataTrigger> <!-- 可选:加上这两个触发器,确保窗口退出最大化时按钮重新显示 --> <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=WindowState}" Value="Normal"> <Setter Property="Visibility" Value="Visible" /> </DataTrigger> <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=WindowState}" Value="Minimized"> <Setter Property="Visibility" Value="Visible" /> </DataTrigger> </Style.Triggers> </Style>
为什么这样有效
RelativeSource.AncestorType=Window能精准找到按钮所在的窗口,绑定它的WindowState属性,窗口状态一变化,DataTrigger就会立刻触发对应的Setter。- 如果你的按钮默认是可见的,也可以只保留最大化的那个DataTrigger——当窗口状态离开Maximized时,触发器自动失效,按钮会恢复默认的可见状态。
内容的提问来源于stack exchange,提问作者user17518546
相关产品推荐
相关产品推荐

