Настройка WPF на шаблоне управления - PullRequest
1 голос
/ 02 марта 2010

Общий вопрос. У меня есть ControlTemplate, который достаточно сложен. Несколько текстовых ящиков и т. Д. Я не могу использовать TemplateBinding, чтобы перенести все свойства на поверхность, чтобы я мог установить все стили.

Есть ли у Style возможность «врезаться» в элементы управления внутри элемента управления для установки значений?

Надеюсь, мой вопрос понятен без примера.

Спасибо

1 Ответ

1 голос
/ 02 марта 2010

Короткий ответ - нет. ControlTemplate по сути является черным ящиком, по крайней мере, в том, что касается XAML (есть способы вырыть визуальное дерево в коде).

Когда вы говорите, что «не можете использовать TemplateBinding», почему бы и нет? Если вам просто не хватает доступных свойств, которые можно исправить, создав некоторые вложенные свойства для значений, которые вы хотите передать. Это предполагает, что вы создаете шаблон элемента управления, который вы не можете изменить, в противном случае вы можете просто добавить новые свойства зависимостей.

Прикрепленное свойство:

public static class CustomProps
{
    public static readonly DependencyProperty MyNewBrushProperty = DependencyProperty.RegisterAttached(
        "MyNewBrush",
        typeof(Brush),
        typeof(CustomProps),
        new UIPropertyMetadata(Brushes.Green));

    public static Brush GetMyNewBrush(DependencyObject target)
    {
        return (Brush)target.GetValue(MyNewBrushProperty);
    }

    public static void SetMyNewBrush(DependencyObject target, Brush value)
    {
        target.SetValue(MyNewBrushProperty, value);
    }
}

И использование в стиле и шаблоне:

<Style TargetType="{x:Type Button}">
    <Setter Property="local:CustomProps.MyNewBrush" Value="Red" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:CustomProps.MyNewBrush)}">
                    <ContentPresenter/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Использование этого метода также позволяет переопределять значения в отдельных экземплярах.

...