gpt4 book ai didi

c# - WPF Template.FindName 总是返回 null

转载 作者:太空狗 更新时间:2023-10-30 00:19:47 25 4
gpt4 key购买 nike

模板

<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;

最佳答案

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

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

然后,使用 VisualTreeHelper 获取您的 Canvas,但我认为您可以调用下面代码的最早位置是 FrameWorkElement已加载。这是我的例子:

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);
}
}

关于c# - WPF Template.FindName 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16839159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com