Ссылка на элемент управления внутри ControlTemplate - PullRequest
4 голосов
/ 23 июня 2010

Как мне сформировать свой конструктор в коде для получения ссылки на элемент управления OuterBorder в XAML ниже?

<Window Template="{DynamicResource WindowTemplate}">
    <Window.Resources>      
        <ControlTemplate x:Key="WindowTemplate" TargetType="{x:Type Window}">
            <AdornerDecorator>
                <Border Name="OuterBorder" Background="Black" BorderBrush="Red" BorderThickness="1" CornerRadius="0">
                    <!-- Implementation here... -->
                </Border>
            </AdornerDecorator>
        </ControlTemplate>
    </Window.Resources>
</Window>

Ответы [ 2 ]

4 голосов
/ 23 июня 2010

Два возможных решения:

Решение 1

Поместить событие Loaded в XAML

<Border Name="OuterBorder" Loaded="Border_Loaded" ...

И в коде позади сохранить его вличное поле:

private Border border;

void Border_Loaded(object sender, RoutedEventArgs e)
{
    this.border = (Border)sender;
}

ИЛИ:

Решение 2

Переопределить шаблон OnApply вашего окна:

private Border border;

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    this.border = (Border) Template.FindName("OuterBorder", this);
}
1 голос
/ 23 июня 2010

Вы можете пересмотреть свой подход. Что ты пытаешься сделать?

Как правило, вам не нужно или не нужно получать доступ к частям ControlTemplate из вашего кода, потому что ваш шаблон - это просто шаблон. Так выглядит контроль. Вы хотите, чтобы ваш код в целом влиял на поведение элемента управления.

Например, если вы пытаетесь повлиять на цвет границы в коде в определенных интерактивных ситуациях, вы действительно хотите добавить некоторые (pre .Net4) триггеры или (post .Net4) a VisualStateManager к вашему шаблон элемента управления для управления визуальными состояниями элемента управления.

...