Очередной вопрос на форумах MSDN. Идея простая, есть некий ControlTemplate, который применяет к некоторому компоненту. В ControlTemplate-е лежат элементы к которым мы хотим получить доступ. Делается это не сложно, под катом пошаговый пример.
1. Создаю пустой проект.
2. Добавляю UserControl котрый будем помещать внуть ControlTemplate, с целью повызывать его методы. Разметка будет иметь вид:
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 UserControl1()
{
InitializeComponent();
}
public void Alert()
{
tbAlert.Text = "А вот теперь произошло!";
}
}
Собственно метод Alert мф и будем вызывать.
3. На главной форме создаем ресурс типа ControlTemplate в который помещаем наш UserControl. Для демонстрации работы, я не буду размещать контрол к которому применяется стиль в XAML-е, а размещу из кода, как было в вопросе на форуме. Ну и кнопка, для того, чтобы показать вызов метода. XAML:
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 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. Запускаем и кликаем:
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. Запускаем и кликаем:
Все работает именно так, как ожидалось.
Комментариев нет:
Отправить комментарий