Wpf 编辑MahApps Metro圆形切换按钮

Wpf 编辑MahApps Metro圆形切换按钮,wpf,xaml,user-interface,mahapps.metro,Wpf,Xaml,User Interface,Mahapps.metro,我知道围绕MahApps Metro风格有一些问题,但我还没有找到一个能解决我所面临问题的问题。 我有一个我正在维护的应用程序,其中很多是我使用一个中央风格的XAML存储库帮助构建的。 我没有构建的一个部分使用了MahApps中Metro Circle切换按钮的样式。根据我的利益相关者,我需要更改所选状态,使其与按钮的正常状态形成更大的对比。但是,我一直无法找到在我的应用程序中访问该样式的位置 我的直觉是在我的存储库中创建一个完整的样式来取代Metro样式,但我想我会四处询问,看看这里是否有人可

我知道围绕MahApps Metro风格有一些问题,但我还没有找到一个能解决我所面临问题的问题。 我有一个我正在维护的应用程序,其中很多是我使用一个中央风格的XAML存储库帮助构建的。 我没有构建的一个部分使用了MahApps中Metro Circle切换按钮的样式。根据我的利益相关者,我需要更改所选状态,使其与按钮的正常状态形成更大的对比。但是,我一直无法找到在我的应用程序中访问该样式的位置

我的直觉是在我的存储库中创建一个完整的样式来取代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行(顺便说一句,我假设在你的metro文件中有一个文件名相同),我们会在模板内部看到
ControlTemplate.Triggers
,它在被检查时会改变
ellipsebg
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>

红色

有意义吗?:)

是的,所以它不适用于您的示例的原因是您不能覆盖通过样式中的触发器与ControlTemplate交互的触发器

因此,如果我们看一下615行(顺便说一句,我假设在你的metro文件中有一个文件名相同),我们会在模板内部看到
ControlTemplate.Triggers
,它在被检查时会改变
ellipsebg
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>

红色

有意义吗?:)

为了结束循环,并将我的答案发布给其他有问题的人,我最终创建了一种风格,并将其放入我的风格库中。我认为我的解决方案可能有点独特,因为我实际上无法访问解决方案中的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源代码

以下是我所做的:

   <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>