0

我在布局中有以下内容:

<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="?????" />

简单来说,是基于 aUserControl加载到的。这一切都非常好,除了一件事:无论我想如何命名它以便它出现在主布局中,它都不会出现。我需要获取对控件的引用,以便可以将事件处理程序附加到它。TemplateDataTriggerUserControl

如果有另一种想法,即如何UserControl从主布局到达而不具体命名,那也是一个解决方案。

4

2 回答 2

2

您需要命名ContentControlControlTemplateTemplate属性中获取,然后您可以使用其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" />

然后在代码中:

ControlTemplate yourTemplate = YourContentControl.Template;
UserControl yourUserControl = 
    (UserControl)yourTemplate.FindName("YourUserControl", YourContentControl);
if (yourUserControl != null)
{
    // do something with your control here
}

当然,如果你在UserControl还没有被设置为 的时候使用这个代码Template,那么你会得到一个错误。因此,您应该检查null

于 2013-10-11T09:21:16.953 回答
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?这就是为什么你必须动态地寻找类似(伪代码)MyFirstControl.MyUC 之类的东西,正如 Sheridan 解释的那样。

于 2013-10-11T09:33:04.560 回答