小编Cas*_*ase的帖子

ItemsControl:如何在ItemsPanelTemplate中使用FindName访问面板

<Style TargetType="{x:Type local:CustomItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <ScrollViewer>
                    <ItemsPresenter x:Name="PART_Presenter"/>
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <StackPanel x:Name="PART_StackPanel" IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

更改子级后,尝试访问StackPanel以设置事件。

[TemplatePartAttribute(Name = "PART_StackPanel", Type = typeof(StackPanel))]
[TemplatePartAttribute(Name = "PART_Presenter", Type = typeof(ItemsPresenter))]
public class CustomItemsControl: ItemsControl
{
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var presenter = (ItemsPresenter)this.Template.FindName("PART_Presenter", this);
        var stackPanel = (StackPanel)this.ItemsPanel.FindName("PART_StackPanel",this);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试找到StackPanel时获取异常。

InvalidOperationException:

此操作仅对应用了此模板的元素有效。

请告知是否有办法在ItemsPanelTemplate中找到TemplatePart。我应该何时知道何时应用ItemsPanelTemplate?

c# wpf

3
推荐指数
1
解决办法
4889
查看次数

标签 统计

c# ×1

wpf ×1