C# WPF Template.FindName返回值始终为null
模板C# WPF Template.FindName返回值始终为null,c#,wpf,xaml,findname,C#,Wpf,Xaml,Findname,模板 <Style TargetType="{x:Type local:Viewport}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type local:Viewport}"> <Border Background="{TemplateBinding
<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>
内容总是返回null,为什么它不工作
如果我用这个替换,程序将直接退出
content = this.ItemsPanel.FindName("PART_Canvas", this) as FrameworkElement;
使用
FindName
只能找到模板中声明的元素<代码>项目spanel
不是该模板的一部分ItemsControl
将ItemsPanel
放入itemsresenter
占位符中,您可以通过该占位符访问画布
,但首先需要在模板中命名itemsresenter
:
<ControlTemplate TargetType="{x:Type local:Viewport}">
<Border>
<ItemsPresenter x:Name="PART_ItemsPresenter"/>
</Border>
</ControlTemplate>
在OnApplyTemplate方法中,尝试content=(Canvas)GetTemplateChild(“PART_Canvas”)之类的操作,看看它是否有效。@Sai GetTemplateChild不起作用。@Canvas在ItemsPanel中,我不知道如何访问它。@sircodesalot
This
,是从我的自定义控件中的ItemsControlHello派生的自定义控件,构造函数是静态的,所以我不能在构造函数中添加'AddHandler',但我把它放在'OnApplyTemplate'中,它工作得很好。非常感谢。
<ControlTemplate TargetType="{x:Type local:Viewport}">
<Border>
<ItemsPresenter x:Name="PART_ItemsPresenter"/>
</Border>
</ControlTemplate>
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);
}
}