为MahApps simpleChildWindow设置橙色样式无效,如何区分模态窗口?
解决MahApps.Metro SimpleChildWindow样式不生效问题
问题场景
尝试为simpleChildWindow:ChildWindow定义橙色主题样式,但设置后标题栏仍显示默认绿色,样式未生效,需要通过视觉区分该模态窗口(用于密码修改提示,避免用户忽略)。
现有代码
定义的样式
<Style x:Key="OrangeChildWindowStyle" TargetType="simpleChildWindow:ChildWindow"> <Setter Property="BorderBrush" Value="#FFA500"/> <Setter Property="BorderThickness" Value="1"/> <Style.Resources> <SolidColorBrush x:Key="MahApps.Brushes.Accent" Color="#FFA500"/> <SolidColorBrush x:Key="MahApps.Brushes.IdealForeground" Color="White"/> <SolidColorBrush x:Key="MahApps.Brushes.Accent2" Color="#FFB84D"/> <SolidColorBrush x:Key="MahApps.Brushes.Accent3" Color="#FFC766"/> <SolidColorBrush x:Key="MahApps.Brushes.Accent4" Color="#FFD489"/> </Style.Resources> </Style>
窗口使用代码
<simpleChildWindow:ChildWindow Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" IsOpen="{Binding ChangeMasterPassword}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Padding="0" BorderBrush="Orange" Style="{StaticResource OrangeChildWindowStyle}" BorderThickness="1" ChildWindowWidth="400" ChildWindowHeight="220" Title="{DynamicResource Authorization}"> <!-- 窗口内容 --> </simpleChildWindow:ChildWindow>
问题原因
之前的样式未生效,是因为simpleChildWindow:ChildWindow的标题栏默认并不直接使用MahApps.Brushes.Accent资源,而是绑定了HeaderBackground属性或内部模板中的MahApps.Brushes.HeaderBackground资源,直接覆盖Accent笔刷无法影响标题栏背景。
解决方案
方案1:直接设置控件属性(最简单)
无需修改样式,直接在ChildWindow标签中指定标题栏相关属性,快速生效:
<simpleChildWindow:ChildWindow Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" IsOpen="{Binding ChangeMasterPassword}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Padding="0" Style="{StaticResource OrangeChildWindowStyle}" ChildWindowWidth="400" ChildWindowHeight="220" Title="{DynamicResource Authorization}" HeaderBackground="#FFA500" TitleBrush="White" BorderBrush="#FFA500" BorderThickness="1"> <!-- 窗口内容 --> </simpleChildWindow:ChildWindow>
方案2:修改样式统一控制
在Style中添加HeaderBackground、TitleBrush等属性的Setter,实现样式复用:
<Style x:Key="OrangeChildWindowStyle" TargetType="simpleChildWindow:ChildWindow"> <Setter Property="BorderBrush" Value="#FFA500"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="HeaderBackground" Value="#FFA500"/> <Setter Property="TitleBrush" Value="White"/> <!-- 可选:调整关闭按钮颜色 --> <Setter Property="CloseButtonForeground" Value="White"/> <Setter Property="CloseButtonHoverForeground" Value="#FFD489"/> </Style>
使用时只需引用该Style,无需重复设置属性:
<simpleChildWindow:ChildWindow Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" IsOpen="{Binding ChangeMasterPassword}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Padding="0" Style="{StaticResource OrangeChildWindowStyle}" ChildWindowWidth="400" ChildWindowHeight="220" Title="{DynamicResource Authorization}"> <!-- 窗口内容 --> </simpleChildWindow:ChildWindow>
方案3:覆盖模板资源(进阶)
如果需要统一模板内所有关联元素的样式,可在Style的Resources中覆盖ChildWindow模板依赖的资源:
<Style x:Key="OrangeChildWindowStyle" TargetType="simpleChildWindow:ChildWindow"> <Setter Property="BorderBrush" Value="#FFA500"/> <Setter Property="BorderThickness" Value="1"/> <Style.Resources> <SolidColorBrush x:Key="MahApps.Brushes.HeaderBackground" Color="#FFA500"/> <SolidColorBrush x:Key="MahApps.Brushes.WindowTitle" Color="White"/> <SolidColorBrush x:Key="MahApps.Brushes.CloseButtonForeground" Color="White"/> <SolidColorBrush x:Key="MahApps.Brushes.CloseButtonHoverForeground" Color="#FFD489"/> </Style.Resources> </Style>
内容的提问来源于stack exchange,提问作者Anton Tropashko
相关产品推荐
相关产品推荐

