gpt4 book ai didi

wpf - 在 ListBox 中查找控件?

转载 作者:行者123 更新时间:2023-12-01 03:26:23 28 4
gpt4 key购买 nike

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

我想从 ListBox 控件中找到“网格”。请帮助我,谢谢。

最佳答案

有几件事要添加到 Meleak 的答案中(这有点太长了,无法发表评论。)

通常,从 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 实际上可能不存在。

关于wpf - 在 ListBox 中查找控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4104472/

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