【问题标题】:WPF XAML: Border Brush on Button with IsDefault="True"WPF XAML:IsDefault="True" 按钮上的边框画笔
【发布时间】:2017-11-29 01:40:12
【问题描述】:

当我尝试在具有 IsDefault="True" 属性的按钮上输入边框画笔颜色时,边框不会更改并保持为 IsDefault 属性的蓝色边框。

如果我删除 IsDefault="True",则应用边框画笔颜色。

有没有办法将按钮设为默认按钮并为其赋予自定义边框颜色?

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    问题在于按钮ControlTemplate,它在某些情况下会改变按钮的外观。

    查看默认按钮的样式/控件模板:

    <Style x:Key="ButtonFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#F3F3F3" Offset="0"/>
        <GradientStop Color="#EBEBEB" Offset="0.5"/>
        <GradientStop Color="#DDDDDD" Offset="0.5"/>
        <GradientStop Color="#CDCDCD" Offset="1"/>
    </LinearGradientBrush>
    <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
    <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
        <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
        <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Themes:ButtonChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsKeyboardFocused" Value="true">
                            <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
                        </Trigger>
                        <Trigger Property="ToggleButton.IsChecked" Value="true">
                            <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="#ADADAD"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    相关部分可能是

    <Themes:ButtonChrome x:Name="Chrome"
        ...
        RenderMouseOver="{TemplateBinding IsMouseOver}"
        RenderPressed="{TemplateBinding IsPressed}"
        RenderDefaulted="{TemplateBinding IsDefaulted}"
        ... >
    

    和控制模板触发器

    <Trigger Property="IsKeyboardFocused" Value="true">
        <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
    </Trigger>
    <Trigger Property="ToggleButton.IsChecked" Value="true">
        <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
    </Trigger>
    

    因此,对于您的具体情况,如果您真的只想为 IsDefault 设置不同的边框,但您希望所有边框都更改为焦点、鼠标悬停和其他状态,那么您可以通过设置 RenderDefaulted="False"Themes:ButtonChrome(而不是RenderDefaulted="{TemplateBinding IsDefaulted}")。

    【讨论】:

      【解决方案2】:

      方法 1: 最好的方法是在您的 Window.Resources 中定义一个样式,将该样式应用于所有按钮:

      <Window.Resources>
          <Style TargetType="{x:Type Button}">
              <Setter Property="BorderBrush" Value="Blue" />
          </Style>
      </Window.Resources>
      

      方法二: 另一种方法是将x:Key="yourButtonStyle" 添加到Style 元素,并将其分配给Style 属性中您想要的任何按钮:

      <Window.Resources>
          <Style x:Key="yourButtonStyle" TargetType="{x:Type Button}">
              <Setter Property="BorderBrush" Value="Blue" />
          </Style>
      </Window.Resources>
      
      <Button Style="{StaticResource yourButtonStyle}"/>
      

      【讨论】:

      • 如果您希望将样式应用于所有按钮,则需要删除方法1中的x:Key。 TargetType 总是需要的!
      • 不走运:/ 仍然保持默认蓝色
      • @NiallMitch14 是的,这就是它的本意。您拥有按钮的默认颜色 - 然后您想要不同的按钮应用样式并将值更改为您想要的颜色
      • 是的,我知道在您的示例中它仍然是蓝色的。但是我把颜色改成了绿色,还是蓝色
      • 您的按钮不能是按钮类型,请将 x:Type: Button 更改为 x:Type ButtonChrome 或您正在使用的任何类型
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多