【问题标题】:WPF Template.FindName return always nullWPF Template.FindName 总是返回 null
【发布时间】:2013-05-26 04:55:19
【问题描述】:

模板

<Style TargetType="{x:Type local:Viewport}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Viewport}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ItemsPresenter/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Canvas x:Name="PART_Canvas" IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

以及 OnApplyTemplate 中的代码

content = this.Template.FindName("PART_Canvas", this) as FrameworkElement;

内容总是返回null,为什么不起作用?

如果我用这个替换,程序直接退出

content = this.ItemsPanel.FindName("PART_Canvas", this) as FrameworkElement;

【问题讨论】:

  • 在 OnApplyTemplate 方法中尝试类似 content = (Canvas)GetTemplateChild("PART_Canvas") 的方法,看看它是否有效。
  • @Sai GetTemplateChild 不起作用..画布在 ItemsPanel 我不知道如何访问它..
  • @sircodesalot This,是从 ItemsControl 派生的自定义控件

标签: c# wpf xaml findname


【解决方案1】:

使用FindName,您只能找到在Template 中声明的元素。 ItemsPanel 不是该模板的一部分。 ItemsControlItemsPanel 放入 ItemsPresenter 占位符中,您可以通过该占位符访问您的 Canvas,但首先您需要在模板中命名 ItemsPresenter

<ControlTemplate TargetType="{x:Type local:Viewport}">
   <Border>
      <ItemsPresenter x:Name="PART_ItemsPresenter"/>
   </Border>
</ControlTemplate>

然后,使用VisualTreeHelper 得到你的Canvas,但我认为你可以调用下面代码的最早位置是FrameWorkElementLoaded。这是我的例子:

public class MyListBox : ListBox
{
  public MyListBox()
  {
      AddHandler(FrameworkElement.LoadedEvent, new RoutedEventHandler(ControlIsLoaded));
  }

  private void ControlIsLoaded(object sender, RoutedEventArgs e)
  {
      var canvas = VisualTreeHelper.GetChild(this.Template.FindName("PART_ItemsPresenter", this) as DependencyObject, 0);
  }
}

【讨论】:

  • 您好,在我的自定义控件中,构造函数是静态的,所以我不能在构造函数中添加“AddHandler”,但我把它放在“OnApplyTemplate”中效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-03-04
  • 2016-11-02
  • 2014-05-06
  • 2012-06-05
  • 2014-05-30
  • 2014-02-23
  • 2017-10-12
  • 2013-08-16
相关资源
最近更新 更多