2009-12-04 8 views
1

У меня есть базовый стиль, скажу:Настройка содержания в унаследованном (BasedOn) стиле

<Style x:Key="DefaultButtonStyle" TargetType="{x:Type Button}"> 
    <Setter Property="Background" Value="{StaticResource DefaultButtonBackground}" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid x:Name="ButtonShapeGrid" Height="{TemplateBinding Height}" Width="{TemplateBinding Height}"> 
        <!-- snip some shaping Xaml. --> 

        <ContentPresenter 
         Grid.RowSpan="2" 
         VerticalAlignment="{TemplateBinding VerticalAlignment}" HorizontalAlignment="Center" /> 

       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Теперь у меня есть необходимость создать несколько стилей, которые заменяют содержание кнопки с чем-то фиксированным ... (так что CloseButtonGlyph - это ресурс пути). Это прекрасно работает:

<Style x:Key="CloseButtonStyle" BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}"> 
    <Setter Property="Content" Value="{StaticResource CloseButtonGlyph}" /> 
</Style> 

Однако, мне также нужно добавить произвольное Xaml в содержание, и это, где у меня есть проблема. Ниже не работает (я получаю ошибку во время разработки о том, что содержание не может быть получена из ContentElement или Визуальное), когда стиль используется в окне WPF или управления:

<Style x:Key="WingDingStyle" BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}"> 
    <Setter Property="Content"> 
     <Setter.Value> 
      <TextBlock FontFamily="WebDings" Text="3" FontSize="18" Foreground="White" /> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я в убытке, как то, что мне нужно сделать. Помещение TextBox в содержимое кнопки в окне или управлении отлично работает, почему бы и нет в стиле?

ответ

3

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

<Style TargetType="{x:Type Button}"> 
    <Style.Resources> 
     <TextBlock x:Key="myContent" FontFamily="WebDings" Background="Red" Text="3" FontSize="18" Foreground="White" /> 
    </Style.Resources> 
    <Setter Property="Content" Value="{DynamicResource myContent}"/> 
</Style> 

и изменение сеттер, как это также работает отлично

<Setter Property="Content" Value="{Binding Source={StaticResource myContent}}"/> 

Надеется, что это поможет !!

+0

Это работает, спасибо. Не знаете, почему просто настройка содержимого не сработает. – SergioL

0

попробовать что-то вроде этого:

<Style x:Key="WingDingStyle" BasedOn="{StaticResource DefaultButtonStyle}" TargetType="{x:Type Button}"> 
    <Style.Resources> 
     <TextBlock x:Key="myContent" FontFamily="WebDings" Text="3" FontSize="18" Foreground="White" /> 
    </Style.Resources> 
    <Setter Property="Content" Value={StaticResource myContent}/> 
</Style> 

Надеется, что это помогает !!

+0

Такая же ошибка, как указано выше. – SergioL

0

Я думаю, проблема в том, что стиль разделяется на несколько кнопок, поэтому WPF пытается добавить один и тот же TextBlock к каждой кнопке (очевидно, что TextBlock может иметь только один элемент пользовательского интерфейса в качестве родителя).

Попробуйте установить стиль для «не разделяется» по умолчанию, так что новый TextBlock создается для каждой кнопки, добавив атрибут x:Shared:

<Style x:Key="WingDingStyle" x:Shared="False" ...> 
+0

Нет, это все еще не удается. – SergioL

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