2016-05-12 98 views
1

我有一個窗口有兩個組框,每個組框有3個按鈕,所有按鈕都應用3種樣式。樣式是:Wpf按鈕樣式不適用

<Style x:Key="SaveButtonStyle" TargetType="Button" >    
    <Setter Property="Content"> 
     <Setter.Value> 
      <DockPanel>      
       <Image Source="/SalesSolution;component/Images/save.png" Stretch="UniformToFill" Height="40" Width="40" VerticalAlignment="Center" />       
       <Label Content="Save" HorizontalAlignment="Right" VerticalContentAlignment="Center" VerticalAlignment="Center" HorizontalContentAlignment="Center" FontSize="16" /> 
      </DockPanel>      
     </Setter.Value> 
    </Setter> 
    <Setter Property="Height" Value="40"/> 
    <Setter Property="Width" Value="100"/> 
</Style> 


<Style x:Key="UpdateButtonStyle" TargetType="Button" > 
    <Setter Property="Content"> 
     <Setter.Value> 
      <DockPanel> 
       <Image Source="/SalesSolution;component/Images/Refresh_font_awesome.png" Stretch="UniformToFill" Height="40" Width="40" VerticalAlignment="Center" /> 
       <Label Content="Update" HorizontalAlignment="Right" VerticalContentAlignment="Center" VerticalAlignment="Center" HorizontalContentAlignment="Center" FontSize="16" /> 
      </DockPanel> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Height" Value="40"/> 
    <Setter Property="Width" Value="100"/> 
</Style> 

<Style x:Key="DeleteButtonStyle" TargetType="Button" > 
    <Setter Property="Content">      
     <Setter.Value> 
      <DockPanel> 
       <Image Source="/SalesSolution;component/Images/delete.png" Stretch="UniformToFill" Height="40" Width="40" VerticalAlignment="Center" /> 
       <Label Content="Delete" HorizontalAlignment="Right" VerticalContentAlignment="Center" VerticalAlignment="Center" HorizontalContentAlignment="Center" FontSize="16" /> 
      </DockPanel> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Height" Value="40"/> 
    <Setter Property="Width" Value="100"/> 
</Style> 

該按鈕的XAML代碼:

//These three buttons do not applied the styles: 
    <Button HorizontalAlignment="Left" Name="buttonCompanySave" VerticalAlignment="Center" Click="buttonCompanySave_Click" Margin="188,215,0,323" Style="{StaticResource SaveButtonStyle}" /> 
    <Button HorizontalAlignment="Left" Name="buttonCompaniesUpdate" VerticalAlignment="Center" Click="buttonCompanyUpdate_Click" Margin="188,274,0,264" Style="{StaticResource UpdateButtonStyle}" /> 
    <Button HorizontalAlignment="Left" Name="buttonCompanyDelete" VerticalAlignment="Center" Click="buttonCompanyDelete_Click" Margin="188,333,0,205" Style="{StaticResource DeleteButtonStyle}" /> 



//These three buttons apply the styles: 
    <Button HorizontalAlignment="Left" Name="buttonItemSave" VerticalAlignment="Bottom" Click="buttonItemSave_Click" Style="{StaticResource SaveButtonStyle}" /> 
    <Button HorizontalAlignment="Center" Name="buttonItemsUpdate" VerticalAlignment="Bottom" Click="buttonItemsUpdate_Click" Style="{StaticResource UpdateButtonStyle}" /> 
    <Button HorizontalAlignment="Right" Name="buttonItemDelete" VerticalAlignment="Bottom" Click="buttonItemDelete_Click" Style="{StaticResource DeleteButtonStyle}" /> 

奇怪的問題是:如果我將空白按鈕(buttonCompanySave,buttonCompaniesUpdate,buttonCompanyDelete)到另一組框,它們適用樣式!我試圖找出這個問題,但我找不到解決方案,我甚至創建了新的組框和按鈕。

enter image description here

+0

來吧格式左 – Paparazzi

回答

2

它發生會導致你的風格變化Content屬性,當你設置新Content值,那麼默認的Button樣式應用於不具有任何ImageLabel

取而代之,您應該創建ContentPresenter來動態設置Content屬性,並在ContentPresenter附近創建您的Image。另外,要排除多個Style's,您可以使用DataTrigger更改SourceImage。請參閱下面的例子:

<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
    <Setter Property="Background" Value="#ffffff"/> 
    <Setter Property="BorderBrush" Value="#cccccc"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Foreground" Value="#333333"/> 
    <Setter Property="HorizontalContentAlignment" Value="Center"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
    <Setter Property="Padding" Value="16,3,16,3"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border Name="Chrome" Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true"> 
       <StackPanel> 
        <TextBlock x:Name="txtBlck" Text="Update"/> 
        <Image x:Name="img"> 
        <Image.Style> 
         <Style TargetType="{x:Type Image}"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Content, ElementName=Presenter}" Value="Update">               
           <Setter Property="Source" Value="/SalesSolution;component/Images/update.png"/> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding Content, ElementName=Presenter}" Value="Save"> 
           <Setter Property="Source" Value="/SalesSolution;component/Images/save.png"/> 
           </DataTrigger> 
           <DataTrigger Binding="{Binding Content, ElementName=Presenter}" Value="Delete"> 
           <Setter Property="Source" Value="/SalesSolution;component/Images/delete.png"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Image.Style> 
        </Image> 
        <ContentPresenter Name="Presenter" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"         RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </StackPanel> 
      </Border> 
      <ControlTemplate.Triggers>         
       <Trigger Property="IsEnabled" Value="false"> 
        <Setter Property="Foreground" Value="#333333" /> 
       </Trigger> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="#dddddd" /> 
        <Setter Property="BorderBrush" Value="#cccccc" /> 
        <Setter Property="Foreground" Value="#333333" /> 
       </Trigger> 
       <Trigger Property="IsPressed" Value="True"> 
        <Setter Property="Background" Value="#1ba1e2" /> 
        <Setter Property="BorderBrush" Value="#1ba1e2"/> 
        <Setter Property="Foreground" Value="#ffffff"/> 
       </Trigger> 
       <Trigger Property="IsFocused" Value="true"> 
        <Setter TargetName="Chrome" Property="BorderBrush" Value="#1ba1e2" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

@BahaaSalaheldin隨意問任何問題。如果您覺得我的回覆對您有幫助,那麼您可以將我的回覆標記爲答案,以簡化未來搜索其他人的過程。請閱讀此http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

0

如果您還沒有:移動你的按鈕樣式到App.xaml。 或者至少到窗口的資源部分:

<Window ... > 
    <Window.Resources> 

    <!--Your button styles:--> 

    </Window.Resources> 
</Window> 
+0

你只需要做到這一點,如果你想要的風格成爲全球性的。如果開發人員想要將風格保持在控制級別,並且從不打算在其他地方使用它,那麼實際上並不需要進入app.xaml – JeremyK

+1

@JeremyK:你是對的,我更新了我的答案。 – Pollitzer

1

@StepUp:我更新了你的代碼,然後它工作現在罰款:

<Image x:Name="img" Stretch="Uniform" StretchDirection="Both"> 
       <Image.Style> 
        <Style TargetType="{x:Type Image}"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Text, ElementName=txtBlck}" Value="Update">               
          <Setter Property="Source" Value="/SalesSolution;component/Images/update.png"/> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding Text, ElementName=txtBlck}" Value="Save"> 
          <Setter Property="Source" Value="/SalesSolution;component/Images/save.png"/> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding Text, ElementName=txtBlck}" Value="Delete"> 
          <Setter Property="Source" Value="/SalesSolution;component/Images/delete.png"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </Image.Style> 
       </Image> 
+0

「更新」是指更改圖像的地址?) – StepUp

+1

您應該將@StepUps帖子標記爲答案。這個網站是免費的,貨幣是聲譽。 – Pollitzer

+0

當您使用'TextBlock'而不是'ContentPresenter'時,這意味着您可以只寫'string'值。但是'ContentPresenter'具有'object'類型,這意味着您可以將任何'Control'設置爲'Button'的'Content',例如'TextBlock','Border'或'StackPanel'。 – StepUp