2017-07-02 99 views
-1

擴展的風格,我的默認按鈕看起來像這樣:如何在WPF

<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/> 
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/> 
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/> 
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/> 
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/> 
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/> 
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/> 
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/> 
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/> 

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="border" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         SnapsToDevicePixels="true" 
         CornerRadius="0"> 
        <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsDefaulted" Value="true"> 
         <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/> 
         <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="true"> 
         <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/> 
         <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/> 
         <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/> 
         <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

而且我要爲登錄按鈕從默認按鈕擴展只改變「CornerRadius」屬性女巫是在邊境,所以我可以使它圓,沒有使另一種風格/模板或使用C#代碼。我想這樣做或類似的東西:

<Style x:Key="loginButton" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}"> 
    <Setter Property="CornerdRadius" Value="10"/> 
</Style> 
+0

可能的[在WPF樣式中設置嵌套元素的屬性]的副本(https://stackoverflow.com/questions/40657840/set-a-property-of-a-nested-element-in- an-wpf-style) – ASh

+0

您是否嘗試將ax:key(例如baseButton)添加到基礎樣式,然後將新樣式基於此關鍵字BasedOn =「{StaticResource baseButton}」? – Gavin

+0

如果我將x:key添加到基礎樣式中,那麼它將不再是基礎樣式,它將變成自定義樣式。 – Toody

回答

0

給你的風格一個名字,然後做一個基於它的無鑰匙風格。

<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}"> 
    <Setter ... /> 
</Style> 

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"/> 

然後根據您的基本樣式爲您的連接按鈕製作第二個樣式。

<Style x:Key="LoginButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}"> 
    <Setter ... /> 
</Style> 

編輯

有一個在WPF按鈕沒有 「CornerRadius」 屬性格式。您必須創建一個繼承Button並添加CornerRadius依賴項屬性的子類。只有這樣,你才能像你想要的那樣繼承你的風格,只需要改變一個設置者。

如果您不想子類化Button,那麼不得不使用另一個模板做第二個樣式並重寫所有觸發器。

另一種選擇是使用現有的屬性,如BorderThickness,Padding或Margin,並將其用於ControlTemplate中的TemplateBinding。但它有點「黑客」,因爲該屬性的名稱並不等於它的功能。

編輯2

至於建議的灰,你也可以使用附加依賴屬性爲您解決問題。 https://stackoverflow.com/a/40663219/1506454

+0

在Button類中沒有'CornerRadius',但是有更多的選項比創建派生類:https://stackoverflow.com/a/40663219/1506454 – ASh

+0

我知道沒有CornerRadius的button屬性只是一個示例只需要第二個樣式能夠改變只BorderRadius沒有再次製作孔模板,並且沒有問題與BasedOn =「{StaticResource {x:Type Button}}」工作完全正常,我不需要製作另一個鍵盤風格。 – Toody

+0

嗯,我不知道,我在其他帖子上看到了您的評論,所以這就是爲什麼我將這個答案與BasedOn內容一起發佈。 ASh是對的,你可以使用附加的DependencyProperty來解決你的問題。 –