Установка содержимого в унаследованном стиле (BasedOn) - PullRequest
1 голос
/ 05 декабря 2009

У меня есть базовый стиль, скажем:

<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 или Visual), когда стиль используется в окне или элементе управления 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 ]

3 голосов
/ 09 декабря 2009

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

<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 голосов
/ 07 декабря 2009

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

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

<Style x:Key="WingDingStyle" x:Shared="False" ...>
0 голосов
/ 05 декабря 2009

попробуйте что-то вроде этого:

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

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...