Стилизация ContentControl - PullRequest
       2

Стилизация ContentControl

3 голосов
/ 15 июля 2011

У меня есть пользовательский элемент управления WPF. Он имеет вложенный ContentControl, который связан со свойством Content шаблона, поэтому в качестве его содержимого может быть установлен любой объект.

Если содержимое является необработанной строкой, я хочу применить следующий стиль к TextBlock (я знаю, что когда визуальное дерево фактически визуализируется, ContentPresenter с TextBlock генерируется, если вы устанавливаете свойство ContentControl Content в строку) .

<Style x:Key="Label" TargetType="TextBlock">
    <Setter Property="TextWrapping" Value="Wrap" />
    <Setter Property="FontSize" Value="14" />
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush>
                <SolidColorBrush.Color>
                    <Color A="255" R="82" G="105" B="146" />
                </SolidColorBrush.Color>
            </SolidColorBrush>
        </Setter.Value>
    </Setter>
</Style>

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

<ContentControl x:Name="SomeText" Margin="10,10,10,0"
                Content="{TemplateBinding Content}"
                IsTabStop="False" Grid.Column="1">
    <ContentControl.Resources>
        <Style TargetType="TextBlock" BasedOn="{StaticResource Label}" />
    </ContentControl.Resources>
</ContentControl>

Так что ... выше сказано (для меня), если ContentControl заканчивается вложенным TextBlock, мы должны применить стиль Label, верно? ... но нет, стиль Label не применяется в приведенном выше примере.

Как мне это сделать?

Спасибо.

1 Ответ

5 голосов
/ 15 июля 2011

Обновление

Объяснение того, почему стиль для созданного TextBlock не применяется, см. В ответе 5 по этой ссылке: Стиль метки переопределения стиля текстового блокав WPF

Это связано с тем, что ContentPresenter создает TextBlock для строкового содержимого, а поскольку этот TextBlock отсутствует в визуальном дереве, он будет искать ресурс уровня Appliacton.И если вы определяете стиль для TextBlock на уровне Appliaction, то он будет применяться к этим TextBlock в ControlControls.

Вы можете использовать DataTemplateSelector

<DataTemplate x:Key="stringTemplate">
    <TextBlock Style="{StaticResource Label}"/>
</DataTemplate>
<local:TypeTemplateSelector x:Key="TypeTemplateSelector"
                            StringTemplate="{StaticResource stringTemplate}" />

<ContentControl ContentTemplateSelector="{StaticResource TypeTemplateSelector}"
                ...>

TypeTemplateSelector пример

public class TypeTemplateSelector : DataTemplateSelector
{
    public DataTemplate StringTemplate { get; set; }

    public override System.Windows.DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is string)
        {
            return StringTemplate;
        }
        return base.SelectTemplate(item, container);
    }
}

Вам также нужно будет привязать свойство Text для TextBlock

<Style x:Key="Label" TargetType="TextBlock">
    <Setter Property="Text" Value="{Binding}"/>
    <!-- Additional setters.. -->
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...