Как изменить шаблонизированные элементы управления, используя стили - PullRequest
0 голосов
/ 21 августа 2010

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

<Window.Resources>
    <ControlTemplate x:Key="Template1" TargetType="Button">
        <Grid>
            <Rectangle Name="rect" Fill="White" Stroke="Blue" StrokeThickness="2"/>
            <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </Grid>
    </ControlTemplate>
    <Style x:Key="Style1" TargetType="Button" >
        <Setter TargetName="rect" Property="Fill" Value="Red"/>
    </Style>
</Window.Resources>

Теперь компилятор жалуется, что TargetName "rect" не является допустимой целью, которую я могу понять, так как необъявленный Button не содержит элемента с именем "rect".

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

Возможно ли добиться такого поведения? Возможно, установив TargetType правильно? Есть еще идеи?

Ответы [ 2 ]

1 голос
/ 21 августа 2010

Стандартным шаблоном является использование TemplateBinding в шаблоне элемента управления для привязки к свойствам самого элемента управления, а затем установка свойств для элемента управления в стиле.Например:

<Window.Resources>
    <ControlTemplate x:Key="Template1" TargetType="Button">
        <Grid>
            <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/>
            <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/>
        </Grid>
    </ControlTemplate>
    <Style x:Key="Style1" TargetType="Button" >
        <Setter Property="Background" Value="Red"/>
    </Style>
</Window.Resources>

Это свяжет свойство Fill на прямоугольнике со свойством Background на кнопке.Стиль установит для свойства Background значение Red, в результате чего для Fill будет установлено значение Red.

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

<Window.Resources>
    <Style x:Key="BaseStyle" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid>
                        <Rectangle Name="rect" Fill="{TemplateBinding Background}" Stroke="Blue" StrokeThickness="2"/>
                        <TextBlock Name="text" Text="Hallo" Foreground="Red" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Background" Value="White"/>
    </Style>
    <Style x:Key="Style1" TargetType="Button" BasedOn="{StaticResource BaseStyle}">
        <Setter Property="Background" Value="Red"/>
    </Style>
</Window.Resources>

Первый стиль применяет шаблон и устанавливает для фона значение White, поэтому прямоугольник будет белым.Второй стиль наследуется от первого, но цвет фона задается красным, поэтому прямоугольник будет красным.

1 голос
/ 21 августа 2010

Вы можете НЕ переопределить только часть шаблона элемента управления.Вы можете либо изменить все, либо ничего.

У вас могут быть установки для свойств стиля.

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