首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么VisualTreeHelper.GetChildrenCount是== 0?

为什么VisualTreeHelper.GetChildrenCount是== 0?
EN

Stack Overflow用户
提问于 2012-04-16 22:41:24
回答 1查看 2.2K关注 0票数 1

我正在尝试从DataTemplate获取我的ToggleButton

代码语言:javascript
复制
ListBoxItem lbi = this.UnitsListBox.ItemContainerGenerator.ContainerFromItem(obj) as ListBoxItem;

lbi正常(不为空)。

我想这样做:

代码语言:javascript
复制
ContentPresenter cp = VisualTreeHelper.GetChild(lbi, 0) as ContentPresenter;
ToggleButton btn = (ToggleButton) VisualTreeHelper.GetChild(cp, 0);

代码语言:javascript
复制
VisualTreeHelper.GetChildrenCount(lbi) is 0. 

这是我的XAML

代码语言:javascript
复制
<ListBox  MaxWidth="215" FlowDirection="RightToLeft" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto"   DockPanel.Dock="Left" Name="UnitsListBox" VirtualizingStackPanel.IsVirtualizing="False" SelectionChanged="UnitsListBox_SelectionChanged" IsSynchronizedWithCurrentItem="True">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.Resources>
                    <Style TargetType="Button"/>
                </ListBox.Resources>
                <ListBox.ItemTemplate  >
                    <DataTemplate >
                        <ToggleButton x:Name="UnitSidebarButton"  FlowDirection="LeftToRight" Height="60" Width="60"  HorizontalContentAlignment="Center" Background="Transparent"  Margin="0" Padding="0" Checked="UnitSidebarButton_Checked" Unchecked="UnitSidebarButton_Unchecked" Focusable="False" VirtualizingStackPanel.IsVirtualizing="False">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Converter={StaticResource cIMSidebarConverter2}}" TextWrapping="Wrap"  TextAlignment="Center" Background="Transparent"/>
                          </Grid>
                        </ToggleButton>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-16 23:12:26

当我将您的代码复制/粘贴到测试项目中时,可视化树层次结构中ListBoxItem下的下一项是Border元素,而不是ContentPresenter (我使用Snoop查看可视化树)。我怀疑这就是为什么您的ContentPresenter对象为空的原因。

如果你感兴趣,我在我的博客上有一些VisualTreeHelpers,可能会让这件事变得更容易。您可以像这样使用它们:

代码语言:javascript
复制
var toggleBtn = VisualTreeHelpers.FindChild<ToggleButton>(lbi);

(旧答案)

您的容器可能不会生成

下面是一个示例,说明如何在运行代码之前使用StatusChanged事件来识别容器是否已生成

代码语言:javascript
复制
public Window()
{
    InitializeComponent();

    // Attach StatusChanged event
    UnitsListBox.ItemContainerGenerator.StatusChanged += 
        ItemContainerGenerator_StatusChanged;
}

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    // If containers have been generated
    if (UnitsListBox.ItemContainerGenerator.Status == 
        System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
    {
        // Remove event
        UnitsListBox.ItemContainerGenerator.StatusChanged -= 
            ItemContainerGenerator_StatusChanged;

        // Do whatever here
        var lbi = UnitsListBox.ItemContainerGenerator.ContainerFromItem(obj) as ListBoxItem;

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10176275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档