2015-12-09 129 views
0

我有一個自定義的按鈕樣式以下觸發器:樣式不適用

<Trigger Property="IsEnabled" Value="true"> 
    <Setter Property="BorderBrush" Value="#FFFFFFFF" /> 
    <Setter Property="Foreground" Value="#FFFFFFFF" /> 
</Trigger> 
<Trigger Property="IsEnabled" Value="false"> 
    <Setter Property="BorderBrush" Value="#FFFF9800" /> 
    <Setter Property="Foreground" Value="#FFFF9800" /> 
</Trigger> 

但他們並不在我的GUI應用在所有。以下是整個風格。

<Window.Resources> 
    <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="#FFFF9800" /> 
          <Setter Property="Opacity" Value="0.50" /> 
         </MultiTrigger> 

         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Property="IsMouseOver" Value="True" /> 
           <Condition Property="Selector.IsSelected" Value="True" /> 
          </MultiTrigger.Conditions> 
          <Setter Property="Background" Value="#FFFFB850" /> 
         </MultiTrigger> 

         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Property="IsMouseOver" Value="False" /> 
           <Condition Property="Selector.IsSelected" Value="True" /> 
          </MultiTrigger.Conditions> 
          <Setter Property="Background" Value="#FFFF9800" /> 
         </MultiTrigger> 

         <Trigger Property="IsEnabled" Value="true"> 
          <Setter Property="BorderBrush" Value="#FFFFFFFF" /> 
          <Setter Property="Foreground" Value="#FFFFFFFF" /> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="BorderBrush" Value="#FFFF9800" /> 
          <Setter Property="Foreground" Value="#FFFF9800" /> 
         </Trigger> 

         <Trigger Property="IsPressed" Value="True"> 
          <Setter TargetName="border" Property="Opacity" Value="0.95" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

我是新來的WPF樣式,因此我不知道我在哪裏出錯了。還包括按鈕代碼:

<Button x:Name="btnScanFP1" Content="Scan Fingerprint" Grid.Column="1" 
     HorizontalAlignment="Left" Margin="10,10,0,0" Grid.Row="4" VerticalAlignment="Top" 
     Width="227" Height="21" Grid.ColumnSpan="2" FontSize="11" Click="btnScanFP1_Click" 
     Background="{x:Null}" BorderBrush="#FFFF9800" Foreground="#FFFF9800" 
     Style="{StaticResource Button.Hoverless}"/> 
+0

您已將該鍵定義爲「Button.Hoverless」,它是DottedXamlName的類型。這種類型的規範用於屬性和事件限定參考,也用於附加成員。所以刪除。從你的關鍵名字。 – user1672994

+0

此外,在windows.Resources中創建的資源是一個鍵控資源,因此它將自動應用。所以,當你需要這種風格時,你應該將其定義爲'Style =「{StaticResource ResourceKeyName}」'。如果你想申請所有的按鈕,然後刪除鍵屬性。 – user1672994

+2

您明確地將按鈕上的背景設置爲'#FFFF9800',其具有[更高的優先級](https://msdn.microsoft.com/library/ms743230%28v=vs.100%29.aspx#listing )比風格觸發器中的設置者要多。使用'Buttonbase'作爲'TargetType'可能有點奇怪,但不應該是一個問題,因爲'Button'從'ButtonBase'繼承。 –

回答

4

按照Dependency Property Setting Precedence List,明確設置屬性具有比風格觸發更高的優先級(其本身具有比風格二傳手更高的優先級)。

從按鈕中刪除BorderBrush="#FFFF9800"將允許樣式觸發器按預期更改邊框刷。 Foreground屬性也是如此。

但或許一個更好的解決方案是通過名字來指邊境的控件模板:

<Trigger Property="IsEnabled" Value="True"> 
    <Setter TargetName="border" Property="BorderBrush" Value="#FFFFFFFF" /> 
</Trigger> 

這將覆蓋在邊框的BorderBrush屬性模板結合,所以當你明確地設置它甚至會申請您的按鈕上的BorderBrush屬性。