<Style TargetType="ListBoxItem" x:Key="ListBoxItemTemplate">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Button Content="{TemplateBinding Content}"></Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ListBox ItemsSource="{Binding S}"
x:Name="listBox"
ItemContainerStyle="{StaticResource ListBoxItemTemplate}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid x:Name="grid" Columns="5"></UniformGrid>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
我想从列表框控件中查找“网格”。请帮助我,谢谢。
在 Melak 的回答中需要添加一些内容(这有点太长了,无法发表评论。)
通常,从 WPF 中的模板获取命名元素的方法是调用模板的 FindName 方法。但是,由于模板基本上是工厂,因此您还需要说明您需要模板的哪个特定实例 - 单个 ItemsPanelTemplate 可能已被实例化多次。所以你需要这样的东西:
var grid = (UniformGrid) listBox.ItemsPanel.FindName("grid", ???);
但那里面有什么???占位符?它不是 ListBox 本身 - ListBox 实际上并不直接使用该 ItemsPanel。最终,它由 ListBox 模板中的 ItemsPresenter 使用。所以你需要这样做:
var grid = (UniformGrid) listBox.ItemsPanel.FindName("grid", myItemsPresenter);
...除了,也没有可靠的方法来获取 ItemsPresenter。事实上,甚至可能没有一个 - 为直接提供托管面板的 ListBox 创建模板是合法的 - 甚至有一个特殊的属性,Panel.IsItemsHost,就是为了这个目的。
这就引出了我想补充的第二点。在 ListBox 的模板不使用 ItemsPresenter 的情况下,ItemsPanel 将不被使用。因此,您试图获取的 UniformGrid 实际上可能根本不存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)