2010-10-04 153 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