wpf - 在 ListBox 中查找控件?

标签 wpf listbox controls find

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

相关文章:

c# - 从图像中获取点的坐标

具有多种类型子节点的 WPF TreeView

wpf - 设计时的 Blend 3 找不到我的转换器/资源。(WPF)

wpf - 限制附加依赖属性范围的约束

javascript - 如何使用 onchange 事件调用函数将元素添加到数组中?

c# - WPF 列表框复制到剪贴板

c# - 获取索引并将值添加到等效索引

asp.net - 在 ASP.NET 面板中查找所有控件?

c# - 如何创建不可选择的上下文菜单项?

c# - 在WinForms中可以控制焦点变化 "automatically"?如果是,我可以以某种方式将其与用户触发的焦点更改区分开来吗?