2012-04-12 88 views
2

我正在为我的应用程序创建一个资源字典,我将在其中有一些“图标+文本”按钮。因为他们看起来都一样(除了图标和文本),我创建了一个通用的风格作为基础,其他:使用泛型作为基础vs自定义用户控件

<!-- Generic ActionButtonStyle --> 
<Style x:Key="ActionButtonStyle" TargetType="{x:Type Button}"> 
    <!-- some setter properties --> 
    <Setter Property="ContentTemplate" Value="{DynamicResource ButtonDataTemplate}"/> 
</Style> 
<DataTemplate x:Key="ButtonDataTemplate"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="24" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <Image Source="{Binding Source}" 
       Stretch="Uniform" 
       Grid.Column="0" 
       Margin="2"/> 
     <TextBlock Text="{Binding text}" 
        TextWrapping="Wrap" 
        Grid.Column="1" 
        Margin="2" 
        VerticalAlignment="Center"/> 
    </Grid> 
</DataTemplate> 

而且我对图标的一些图片:

<!-- Icons --> 
    <ImageSource x:Key="textToSpeech">Images/GreyIcons/TextToSpeech.png</ImageSource> 
    <ImageSource x:Key="play">Images/GreyIcons/Play.png</ImageSource> 
    <ImageSource x:Key="playSound">Images/GreyIcons/PaySound.png</ImageSource> 
    . 
    . 
    . 
    . 
    <ImageSource x:Key="group">Images/GreyIcons/Goup1.png</ImageSource> 

而且我想为每个按钮(对应于每个图标)创建单独的样式。类似这样的:

<!-- Specific ActionButtonStyles --> 
<Style x:Key="TextToSpeechButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource ActionButtonStyle}"> 
    <Setter Property="Content"> 
     <Setter.Value> 
      <Image Source="{StaticResource textToSpeech}" 
     </Setter.Value> 
    </Setter> 
</Style> 

我知道这不起作用。我应该怎么做?我应该为通用按钮创建一个自定义用户控件吗?该文本将绑定到我的模型中的一个对象,命令(对一个动作)也一样。

回答

1

你正在寻找什么的例子似乎缺失,但似乎你可能正在寻找“BasedOn” - 它允许你继承,但仍然覆盖以前定义的风格。你可以这样实现:

<Style x:Key="MyButtonStyle" BasedOn="{StaticResource ActionButtonStyle}"> 
    <Setter.../> 
</Style> 
+0

我知道,但我应该使用哪一个setter? (有些代码丢失了,我刚刚更新了我的问题) – Joana 2012-04-12 09:20:12

1

你需要从按钮创建一个派生类,添加两个新的DependancyProperties。他们将被称为像文字和图像源。您的派生类也会按照您的指示设置ContentTemplate。这个ContentTemplate会绑定Text和ImageSource的依赖属性。

然后,您可以在XAML像这样创建自定义的控制......

<app:CustomButton Text="Play" Source="{Binding play}"/> 

...但如果你想同一个按钮一遍又一遍,你可以创建一个应用到的CustomButton风格并根据需要设置这两个属性。