代码之家  ›  专栏  ›  技术社区  ›  TerrorAustralis

为什么按钮背景在ispressed为true时默认为灰色?

  •  1
  • TerrorAustralis  · 技术社区  · 15 年前

    我有一个简单的问题。使用ispressed触发器,我希望能够将按钮的背景色设置为默认灰色以外的其他颜色。以下是未按下按钮时的外观

    下面是单击时的外观

    这是按钮的触发器。我知道触发器是正确的,因为当它被点击时,按钮边缘的发光效果。我也知道画笔是正确的,因为我试着把它作为背景画笔来看看它是什么样子的。

    <style.triggers>
    <trigger property=“ismouseover”value=“true”>
    <setter property=“background”value=“dynamicResource buttonHoverBrush”/>
    <setter property=“bitmapeffect”value=“dynamicResource buttonHoverGlow”/>gt;
    </trigger>
    &!--这是正在工作的触发器,但背景色不会更改-->
    <trigger property=“ispressed”value=“true”>
    <setter property=“bitmapeffect”value=“dynamicResource buttonHoverGlow”/>gt;
    <setter property=“background”value=“dynamicResource buttonPressedBrush”“/>
    </trigger>
    </style.triggers>
    < /代码> 
    
    

    这里是整个样式,如您所见,它是应用于应用程序中所有按钮的默认样式。

    <style targetType=“button”>
    <setter property=“background”value=“dynamicResource buttonBrush”/>gt;
    <setter property=“foreground”value=“black”/>
    <style.triggers>
    <trigger property=“ismouseover”value=“true”>
    <setter property=“background”value=“dynamicResource buttonHoverBrush”/>
    <setter property=“bitmapeffect”value=“dynamicResource buttonHoverGlow”/>gt;
    </trigger>
    <trigger property=“ispressed”value=“true”>
    <setter property=“bitmapeffect”value=“dynamicResource buttonHoverGlow”/>gt;
    <setter property=“background”value=“dynamicResource buttonPressedBrush”“/>
    </trigger>
    </style.triggers>
    &风格/风格;
    < /代码> 
    
    

    这里是最终解决方案(感谢所有帮助过的人)

    1. 为常规按钮创建控件模板并执行一些数据绑定:

      <controlTemplate targetType=“Button”x:key=“ButtonControlTemplate”>
      <border background=“模板绑定背景”
      borderthickness=“模板绑定borderthickness”
      borderBrush=“模板绑定borderBrush”
      cornerradius=“3”>
      格栅& GT;
      <ContentPresenter ContentSource=“模板绑定内容”
      contenttemplate=“模板绑定contenttemplate”
      VerticalAlignment=“模板绑定VerticalContentAlignment”
      HorizontalSignment=“模板绑定HorizontalContentAlignment”/>
      和/格栅& GT;
      &边界/gt;
      </controltemplate>
      
    2. 将控件模板添加到样式:

      <style targetType=“button”>
      <setter property=“background”value=“dynamicResource buttonBrush”/>gt;
      <setter property=“foreground”value=“black”/>
      <setter property=“template”value=“dynamicResource buttonControlTemplate”“/>
      <setter property=“borderthickness”value=“1”/>
      <style.triggers>
      <trigger property=“ismouseover”value=“true”>
      <setter property=“background”value=“dynamicResource buttonHoverBrush”/>
      <setter property=“bitmapeffect”value=“dynamicResource buttonHoverGlow”/>gt;
      </trigger>
      <trigger property=“ispressed”value=“true”>
      <setter property=“bitmapeffect”value=“dynamicResource buttonHoverGlow”/>gt;
      <setter property=“background”value=“dynamicResource buttonPressedBrush”“/>
      </trigger>
      </style.triggers>
      &风格/风格;
      

    注意:BorderThickness默认为1,否则它不会显示将按钮的r改为默认的灰色。这是不按按钮时的样子
    alt text

    这是点击时的样子
    alt text

    这是按钮的触发器。我知道触发器是正确的,因为当它被点击时,按钮边缘的发光效果。我也知道画笔是正确的,因为我试着把它作为背景画笔来看看它是什么样子的。

        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            </Trigger>
            <!-- This is the trigger which is working but the background color wont change -->
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
                <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
            </Trigger>
        </Style.Triggers>  
    

    这里是整个样式,如您所见,它是应用于应用程序中所有按钮的默认样式。

    <Style TargetType="Button">
        <Setter Property="Background" Value="{DynamicResource ButtonBrush}" />
        <Setter Property="Foreground" Value="Black" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
                <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
            </Trigger>
        </Style.Triggers>
    </Style>
    

    这是最终的解决方案(感谢所有帮助过的人)

    1. 为常规按钮创建控件模板,并执行一些数据绑定:

      <ControlTemplate TargetType ="Button" x:Key="ButtonControlTemplate">
           <Border Background="{TemplateBinding Background}"
                   BorderThickness="{TemplateBinding BorderThickness}"
                   BorderBrush="{TemplateBinding BorderBrush}"
                   CornerRadius="3">
               <Grid>
                   <ContentPresenter ContentSource="{TemplateBinding Content}" 
                                     ContentTemplate="{TemplateBinding ContentTemplate}"
                                     VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                     HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
               </Grid>           
           </Border>
      </ControlTemplate>
      
    2. 将控件模板添加到样式:

      <Style TargetType="Button">
          <Setter Property="Background" Value="{DynamicResource ButtonBrush}" />
          <Setter Property="Foreground" Value="Black" />
          <Setter Property="Template" Value="{DynamicResource ButtonControlTemplate}" />
          <Setter Property="BorderThickness" Value="1" />
          <Style.Triggers>
              <Trigger Property="IsMouseOver" Value="True">
                  <Setter Property="Background" Value="{DynamicResource ButtonHoverBrush}"/>
                  <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
              </Trigger>
              <Trigger Property="IsPressed" Value="True">
                  <Setter Property="BitmapEffect" Value="{DynamicResource ButtonHoverGlow}"/>
                  <Setter Property="Background" Value="{DynamicResource ButtonPressedBrush}" />
              </Trigger>
          </Style.Triggers>
      </Style>
      

    注意:BorderThickness默认为1,否则它不会显示

    1 回复  |  直到 15 年前
        1
  •  1
  •   Oggy    15 年前

    问题在于Windows XP主题luna的默认控件模板。如果将“显示属性”中的主题更改为“经典”,则样式将正常工作。

    应该可以覆盖WPF中的系统颜色,但我还没有用该解决方案解决您的问题,可能颜色已冻结,无法更改,或者用于创建特定主题外观的类ButtonChrome已损坏。

    我认为您最好的选择是为按钮制作自己的控件模板。