我在布局中有以下内容:
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentPane}" Value="Pane1">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<uc:UserControl x:Name="?????" />
简单来说,UserControl
基于Template
加载到DataTrigger
。这一切都很有效,除了一件事:无论我如何命名这个UserControl
以便它出现在主布局中,它都不会出现。我需要获得对控件的引用,以便我可以将事件处理程序附加到它。
如果有另外一个关于如何从主布局到达UserControl
而没有专门命名的想法,那也是一个解决方案。
答案 0 :(得分:2)
您需要命名ContentControl
并从ControlTemplate
属性中获取Template
,然后您可以使用FindName
方法访问UserControl
<ContentControl Name="YourContentControl">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentPane}" Value="Pane1">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<uc:UserControl x:Name="YourUserControl" />
1}}:
ControlTemplate yourTemplate = YourContentControl.Template;
UserControl yourUserControl =
(UserControl)yourTemplate.FindName("YourUserControl", YourContentControl);
if (yourUserControl != null)
{
// do something with your control here
}
然后在代码中:
UserControl
当然,如果您在Template
尚未设置为null
时使用此代码,则会出现错误。因此,您应该检查{{1}}:
答案 1 :(得分:0)
我是这样看的:在定义Template
属性时你正在做的是定义class
以在wpf模板control
时实例化。 uc:UserControl
不是对实例的引用,因此您无法使用x:Name
属性引用它。
如果你在一个单独的资源中定义了ControlTemplate
,也许更容易看到它不是一个实例:
<ControlTemplate x:Key="MyControlTemplate">
<uc:UserControl x:Name="MyUC">
</ControlTemplate>
<ContentControl x:Name="MyFirstContentControl">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentPane}" Value="Pane1">
<Setter Property="Template" Value="{StaticResource MyControlTemplate}">
[...]
<ContentControl x:Name="MySecondContentControl">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentPane}" Value="Pane1">
<Setter Property="Template" Value="{StaticResource MyControlTemplate}">
[...]
现在,如果您引用“MyUC”,它会引用两个实例中的哪一个? UserControl
内的MyFirstContentControl
模板或MySecondContentControl
内的模板?这就是为什么你必须像Sheridan解释的那样动态地寻找像(psoeudo代码)MyFirstControl.MyUC这样的东西。