编辑 MahApps Metro Circle Toggle 按钮
Editing a MahApps Metro Circle Toggle button
我知道围绕 MahApps Metro 样式存在一些问题,但我还没有找到可以解决我遇到的问题的问题。
我有一个正在维护的应用程序,其中很多都是我使用中央样式 XAML 存储库帮助构建的。
我没有构建的部分使用 MahApps 的 Metro Circle Toggle Button 样式。根据我的利益相关者的说法,我需要将选定状态更改为与按钮的正常状态形成鲜明对比。但是,我无法在我的应用程序中找到访问该样式的位置。
我的直觉是在我的存储库中创建一个完整的样式来替换 Metro 样式,但我想我会四处打听这里是否有人可以帮助我。
如有任何提示,我们将不胜感激。
更新 1:
我尝试使用 BasedOn 属性 来减少代码量。然后,当 "IsChecked" 为 True 时,我将背景颜色设置为从黑色切换为白色。
这是我添加的代码:
<Style x:Key="CustomCircleToggleButtonStyle"
TargetType="{x:Type ToggleButton}"
BasedOn="{StaticResource MetroCircleToggleButtonStyle}">
<Setter Property="Background" Value="{StaticResource DarkBorder}"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True" >
<Setter Property="Background" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
不幸的是,MahApps 下沉时有一些动画使按钮从黑色变为白色,然后逐渐变为深蓝色,我正试图摆脱这种颜色。
这是 wpf 切换按钮:
<ToggleButton Width="50" IsEnabled="{Binding IsMultipleSelected,Converter= {StaticResource BooleanNegate}}"
Height="50"
Style="{DynamicResource CustomCircleToggleButtonStyle}"
Command="{Binding Path=GroupSelectCommand}"
IsChecked="{Binding IsLasoSelected}">
<Rectangle Width="20"
Height="20"
Fill="{DynamicResource IconButtonActiveBorder}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill"
Visual="{DynamicResource appbar_lasso}" />
</Rectangle.OpacityMask>
</Rectangle>
</ToggleButton>
我希望将其中的很多内容移动到样式中,但我必须保持功能。
是的,它不适用于您的示例的原因是您无法覆盖通过样式中的触发器与 ControlTemplate 交互的触发器....
因此,如果我们看一下第 615 行 here(顺便说一句,我假设您的 metro 文件中有一个同名文件)我们会在模板中看到 ControlTemplate.Triggers
IsChecked 正在更改 ellipsebg
椭圆的不透明度。它又很难填充 {DynamicResource AccentColorBrush}
...
所以...您可以在实例级别覆盖该画笔...或者,只需编辑完整样式模板以一起使用不同的画笔。
换句话说,您可以将 Fill="{DynamicResource AccentColorBrush}"
的第 630 行更改为另一个画笔或画笔资源,它会继承到每个实例(我会选择保留可集中维护的属性)。
或者,例如:
<StackPanel>
<StackPanel.Resources>
<SolidColorBrush x:Key="AccentColorBrush">Red</SolidColorBrush>
<Style TargetType="ToggleButton"
BasedOn="{DynamicResource CustomCircleToggleButtonStyle}"/>
</StackPanel.Resources>
<ToggleButton/>
<ToggleButton/>
<ToggleButton/>
</StackPanel>
有道理吗? :)
为了结束这个循环,post 我对其他有问题的人的回答,我最终创建了一个样式,并将其放入我的样式库中。我认为我的解决方案可能有点独特,因为我实际上无法访问我的解决方案中的 MahApps.Metro 源代码。
这是我所做的:
<Style x:Key="CircleButton" TargetType="ToggleButton">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Margin" Value="2"/>
<Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisual}"/>
<Setter Property="Margin" Value="2 2 2 2"/>
<Setter Property="Width" Value="45"/>
<Setter Property="Height" Value="45"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Grid>
<Ellipse x:Name="BorderCircle">
<Ellipse.Fill>
<SolidColorBrush Color="SlateGray"/>
</Ellipse.Fill>
</Ellipse>
<Ellipse x:Name="BodyCircle" Margin="3" >
<Ellipse.Fill >
<SolidColorBrush Color="Black"/>
</Ellipse.Fill>
</Ellipse>
<Rectangle x:Name="Mask"
Width="20"
Height="20"
Fill="{DynamicResource IconButtonActiveBorder}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill"
Visual="{DynamicResource appbar_lasso}" />
</Rectangle.OpacityMask>
</Rectangle>
<ContentPresenter x:Name="content" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="BodyCircle" Property="Fill" Value="White"/>
<Setter TargetName="BorderCircle" Property="Fill" Value="Black"/>
<Setter TargetName="Mask" Property="Fill" Value="Black"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="BodyCircle" Property="Fill" Value="DarkOrange"/>
<Setter TargetName="BorderCircle" Property="Fill" Value="Black"/>
<Setter TargetName="Mask" Property="Fill" Value="Black"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这让我可以完全控制切换按钮的所有方面,并获得与以前相同的外观。我所要做的就是从 WPF 视图中调用它来实现它:
<ToggleButton IsEnabled="{Binding IsMultipleSelected,Converter={StaticResource BooleanNegate}}"
Style="{DynamicResource CircleButton}"
Command="{Binding Path=GroupSelectCommand}"
IsChecked="{Binding IsLasoSelected}">
</ToggleButton>
希望这对其他人有所帮助。
我知道围绕 MahApps Metro 样式存在一些问题,但我还没有找到可以解决我遇到的问题的问题。 我有一个正在维护的应用程序,其中很多都是我使用中央样式 XAML 存储库帮助构建的。 我没有构建的部分使用 MahApps 的 Metro Circle Toggle Button 样式。根据我的利益相关者的说法,我需要将选定状态更改为与按钮的正常状态形成鲜明对比。但是,我无法在我的应用程序中找到访问该样式的位置。
我的直觉是在我的存储库中创建一个完整的样式来替换 Metro 样式,但我想我会四处打听这里是否有人可以帮助我。
如有任何提示,我们将不胜感激。
更新 1: 我尝试使用 BasedOn 属性 来减少代码量。然后,当 "IsChecked" 为 True 时,我将背景颜色设置为从黑色切换为白色。 这是我添加的代码:
<Style x:Key="CustomCircleToggleButtonStyle"
TargetType="{x:Type ToggleButton}"
BasedOn="{StaticResource MetroCircleToggleButtonStyle}">
<Setter Property="Background" Value="{StaticResource DarkBorder}"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True" >
<Setter Property="Background" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
不幸的是,MahApps 下沉时有一些动画使按钮从黑色变为白色,然后逐渐变为深蓝色,我正试图摆脱这种颜色。
这是 wpf 切换按钮:
<ToggleButton Width="50" IsEnabled="{Binding IsMultipleSelected,Converter= {StaticResource BooleanNegate}}"
Height="50"
Style="{DynamicResource CustomCircleToggleButtonStyle}"
Command="{Binding Path=GroupSelectCommand}"
IsChecked="{Binding IsLasoSelected}">
<Rectangle Width="20"
Height="20"
Fill="{DynamicResource IconButtonActiveBorder}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill"
Visual="{DynamicResource appbar_lasso}" />
</Rectangle.OpacityMask>
</Rectangle>
</ToggleButton>
我希望将其中的很多内容移动到样式中,但我必须保持功能。
是的,它不适用于您的示例的原因是您无法覆盖通过样式中的触发器与 ControlTemplate 交互的触发器....
因此,如果我们看一下第 615 行 here(顺便说一句,我假设您的 metro 文件中有一个同名文件)我们会在模板中看到 ControlTemplate.Triggers
IsChecked 正在更改 ellipsebg
椭圆的不透明度。它又很难填充 {DynamicResource AccentColorBrush}
...
所以...您可以在实例级别覆盖该画笔...或者,只需编辑完整样式模板以一起使用不同的画笔。
换句话说,您可以将 Fill="{DynamicResource AccentColorBrush}"
的第 630 行更改为另一个画笔或画笔资源,它会继承到每个实例(我会选择保留可集中维护的属性)。
或者,例如:
<StackPanel>
<StackPanel.Resources>
<SolidColorBrush x:Key="AccentColorBrush">Red</SolidColorBrush>
<Style TargetType="ToggleButton"
BasedOn="{DynamicResource CustomCircleToggleButtonStyle}"/>
</StackPanel.Resources>
<ToggleButton/>
<ToggleButton/>
<ToggleButton/>
</StackPanel>
有道理吗? :)
为了结束这个循环,post 我对其他有问题的人的回答,我最终创建了一个样式,并将其放入我的样式库中。我认为我的解决方案可能有点独特,因为我实际上无法访问我的解决方案中的 MahApps.Metro 源代码。
这是我所做的:
<Style x:Key="CircleButton" TargetType="ToggleButton">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Margin" Value="2"/>
<Setter Property="FocusVisualStyle" Value="{StaticResource MyFocusVisual}"/>
<Setter Property="Margin" Value="2 2 2 2"/>
<Setter Property="Width" Value="45"/>
<Setter Property="Height" Value="45"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Grid>
<Ellipse x:Name="BorderCircle">
<Ellipse.Fill>
<SolidColorBrush Color="SlateGray"/>
</Ellipse.Fill>
</Ellipse>
<Ellipse x:Name="BodyCircle" Margin="3" >
<Ellipse.Fill >
<SolidColorBrush Color="Black"/>
</Ellipse.Fill>
</Ellipse>
<Rectangle x:Name="Mask"
Width="20"
Height="20"
Fill="{DynamicResource IconButtonActiveBorder}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill"
Visual="{DynamicResource appbar_lasso}" />
</Rectangle.OpacityMask>
</Rectangle>
<ContentPresenter x:Name="content" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="BodyCircle" Property="Fill" Value="White"/>
<Setter TargetName="BorderCircle" Property="Fill" Value="Black"/>
<Setter TargetName="Mask" Property="Fill" Value="Black"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="BodyCircle" Property="Fill" Value="DarkOrange"/>
<Setter TargetName="BorderCircle" Property="Fill" Value="Black"/>
<Setter TargetName="Mask" Property="Fill" Value="Black"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这让我可以完全控制切换按钮的所有方面,并获得与以前相同的外观。我所要做的就是从 WPF 视图中调用它来实现它:
<ToggleButton IsEnabled="{Binding IsMultipleSelected,Converter={StaticResource BooleanNegate}}"
Style="{DynamicResource CircleButton}"
Command="{Binding Path=GroupSelectCommand}"
IsChecked="{Binding IsLasoSelected}">
</ToggleButton>
希望这对其他人有所帮助。