2010-10-04 156 views

回答

16

您需要创建自己的自定义按钮模板有过在所有状态的外观完全控制。这是一个tutorial

+2

谢谢,那很完美。做起来比我想象的要复杂得多,但现在一切正常。 – Nellius 2010-10-04 11:58:14

+1

出于某种原因,有100个关于为WPF控件创建自定义模板的答案,而且它们都是不必要的错误。没有理由为了改变一件事而努力为一个按钮编写50行模板代码。您只需在xaml设计器中右键单击控件并创建模板代码的副本即可。 VS会从那个确切的按钮创建一个样式,你可以从那里调整它。花费2秒钟。 – 2017-10-20 21:40:36

84

这类似于马克希思但没有那么多的代码称为只需要创建一个非常基本的按钮解决方案,无需内置的鼠标动画效果。它保留了简单的鼠标效果,显示黑色的按钮边框。例如,样式可以插入到Window.Resources或UserControl.Resources部分(如图所示)。

<UserControl.Resources> 
     <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect --> 
     <Style x:Key="MyButtonStyle" TargetType="Button"> 
      <Setter Property="OverridesDefaultStyle" Value="True"/> 
      <Setter Property="Margin" Value="5"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border Name="border" 
          BorderThickness="1" 
          Padding="4,2" 
          BorderBrush="DarkGray" 
          CornerRadius="3" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="border" Property="BorderBrush" Value="Black" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 

<!-- usage in xaml --> 
<Button Style="{StaticResource MyButtonStyle}">Hello!</Button> 
+1

我很喜欢这个解决方案。但是,鼠标悬停触发器仅在鼠标位于按钮上的文本上时才会激活。我在按钮内添加了一个指定宽度的文本块来解决这个问题。 – Dave 2016-01-27 04:03:06

2

如果有人不想覆盖默认的控制模板,那么这里是解决方案。

您可以为按钮,可以TextBlock中,然后就可以在IsMouseOver属性写属性触发了效果禁用鼠标创建的DataTemplate。 TextBlock和Button的高度应该相同。

<Button Background="Black" Margin="0" Padding="0" BorderThickness="0" Cursor="Hand" Height="20"> 
        <Button.ContentTemplate> 
         <DataTemplate> 
          <TextBlock Text="GO" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" TextDecorations="Underline" Margin="0" Padding="0" Height="20"> 
           <TextBlock.Style> 
            <Style TargetType="TextBlock"> 
             <Style.Triggers> 
              <Trigger Property ="IsMouseOver" Value="True"> 
               <Setter Property= "Background" Value="Black"/> 
              </Trigger> 
             </Style.Triggers> 
            </Style> 
           </TextBlock.Style> 
          </TextBlock> 
         </DataTemplate> 
        </Button.ContentTemplate> 
       </Button> 
1

上dodgy_coder的答案的扩展,它增加了..

  • 支持维护WPF按钮样式
  • 增加支持IsSelected和悬停,即切换按钮

    <Style x:Key="Button.Hoverless" TargetType="{x:Type ButtonBase}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type ButtonBase}"> 
            <Border Name="border" 
              BorderThickness="{TemplateBinding BorderThickness}" 
              Padding="{TemplateBinding Padding}" 
              BorderBrush="{TemplateBinding BorderBrush}" 
              Background="{TemplateBinding Background}"> 
             <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
            </Border> 
            <ControlTemplate.Triggers> 
             <MultiTrigger> 
              <MultiTrigger.Conditions> 
               <Condition Property="IsMouseOver" Value="True" /> 
               <Condition Property="Selector.IsSelected" Value="False" /> 
              </MultiTrigger.Conditions> 
              <Setter Property="Background" Value="#FFBEE6FD" /> 
             </MultiTrigger> 
    
             <MultiTrigger> 
              <MultiTrigger.Conditions> 
               <Condition Property="IsMouseOver" Value="True" /> 
               <Condition Property="Selector.IsSelected" Value="True" /> 
              </MultiTrigger.Conditions> 
              <Setter Property="Background" Value="#BB90EE90" /> 
             </MultiTrigger> 
    
             <MultiTrigger> 
              <MultiTrigger.Conditions> 
               <Condition Property="IsMouseOver" Value="False" /> 
               <Condition Property="Selector.IsSelected" Value="True" /> 
              </MultiTrigger.Conditions> 
              <Setter Property="Background" Value="LightGreen" /> 
             </MultiTrigger> 
    
             <Trigger Property="IsPressed" Value="True"> 
              <Setter TargetName="border" Property="Opacity" Value="0.95" /> 
             </Trigger> 
            </ControlTemplate.Triggers> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
    

例子..

<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />

0

使用模板触发器:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Background" Value="White"></Setter> 
    ... 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Background="{TemplateBinding Background}"> 
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="White"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
14

我想补充一个非常简单的解决方案,这是对我不够好,我觉得地址业务方案的问题。我使用了解决方案in this answer,但使用常规值Background而不是图片。

<Style x:Key="SomeButtonStyle" TargetType="Button"> 
    <Setter Property="Background" Value="Transparent" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid Background="{TemplateBinding Background}"> 
        <ContentPresenter /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

无需重新模板超出迫使Background永远是从模板按钮Transparent背景 - 鼠标悬停不再影响一旦做到这一点的背景。显然用任何首选值代替Transparent

0

松饼人有一个非常简单的答案,为我工作。

要加一点更具体的方向,至少VS 2013:

  • 右键单击控制
  • 选择编辑模板=>编辑副本...
  • 我选择在哪里保存样式
    • 从这里你可以直接编辑的App.xaml,看到直观地命名属性“应用程序”。对于我而言,我只是设置RenderMouseOver =“假”
  • 然后,在MainWindow.xaml或任何你的GUI是,你可以在按钮标签,例如结束粘贴新风格... Style="{DynamicResource MouseOverNonDefault}"/>
+0

谁是松饼人? – mjwatts 2017-11-17 22:06:46

+0

大声笑。他对问题所有人接受的答案做了第二次答复。不知道你是在严肃地问还是在开玩笑。很难说像松饼人这样的名字。 – 2017-11-18 00:06:54