2012-04-12 2 views
2

Я создаю ресурсный словарь для своего приложения, где у меня будут кнопки «значок + текст». Так как они все будут выглядеть одинаково (значок и текст, за исключением), я создал общий стиль, чтобы служить в качестве основы для других:Использование универсального стиля в качестве базового и пользовательского элемента управления

<!-- 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

Я знаю это, но какой сеттер я должен использовать? (Некоторый код отсутствовал, я только что обновил свой вопрос) – Joana

1

Вам нужно создать производный класс от Button, который добавит два новых DependancyProperties. Они будут называться чем-то вроде Text и ImageSource. Ваш производный класс также установил бы ContentTemplate, как вы указали. Этот ContentTemplate будет привязан к свойствам зависимости Text и ImageSource.

Вы можете создать свой собственный контроль в XAML как это ...

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

... но если вы хотите ту же кнопку снова и снова, вы можете создать стиль, который применяется к CustomButton и устанавливает эти два свойства по мере необходимости.

Смежные вопросы