четверг, 27 февраля 2014 г.

Доступ к элементам расположенным внутри ControlTemplate

Очередной вопрос на форумах MSDN. Идея простая, есть некий ControlTemplate, который применяет к некоторому компоненту. В ControlTemplate-е лежат элементы к которым мы хотим получить доступ. Делается это не сложно, под катом пошаговый пример.

1. Создаю пустой проект.
2. Добавляю UserControl котрый будем помещать внуть ControlTemplate, с целью повызывать его методы. Разметка будет иметь вид:

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBlock x:Name="tbAlert" Text="Пока ничего не произошло" />
    </Grid>
</UserControl>

ну и код:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }
 
    public void Alert()
    {
        tbAlert.Text = "А вот теперь произошло!";
    }
}

Собственно метод Alert мф и будем вызывать.
3. На главной форме создаем ресурс типа ControlTemplate в который помещаем наш UserControl. Для демонстрации работы, я не буду размещать контрол к которому применяется стиль в XAML-е, а размещу из кода, как было в вопросе на форуме. Ну и кнопка, для того, чтобы показать вызов метода. XAML:

<Window xmlns:WpfApplication1="clr-namespace:WpfApplication1"  x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ControlTemplate x:Key="RectangleTemplate" TargetType="Thumb">
            <WpfApplication1:UserControl1 x:Name="wordRect" />           
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Button Content="Click me!" Click="Button_Click" />
        <StackPanel Grid.Row="1" x:Name="spPlace" />
    </Grid>
</Window>
Код в котором мы создаем Thumb и что самое главное работаем с нашим UserControl-ом размещенном внутри ControlTemplate:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
    }
 
    Thumb thumb1 = null;
 
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        if (thumb1 == null)
        {
            thumb1 = new Thumb();
            ControlTemplate template = FindResource("RectangleTemplate") as ControlTemplate;
            thumb1.Template = template;
            spPlace.Children.Add(thumb1);
        }
    }
 
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        UserControl1 wr = (UserControl1)thumb1.Template.FindName("wordRect", thumb1);
        wr.Alert();
    }
}

4. Запускаем и кликаем:
Все работает именно так, как ожидалось.

Комментариев нет:

Отправить комментарий