首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ItemsControl.Items枚举为UIElements

将ItemsControl.Items枚举为UIElements
EN

Stack Overflow用户
提问于 2010-02-25 19:33:45
回答 4查看 2.5K关注 0票数 4

我有一个通过ItemsControl显示的超链接列表,如下所示:

代码语言:javascript
复制
 <ItemsControl x:Name="SubMenu" Visibility="Collapsed">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <HyperlinkButton Content="{Binding Name}"
                                 NavigateUri="{Binding Url}"
                                 TargetName="ContentFrame"
                                 Style="{StaticResource LinkStyle}"
                                 />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Style="{StaticResource LinksStackPanelStyle}"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Left" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

我需要做的是枚举子菜单中的实际超链接,如下所示:

代码语言:javascript
复制
    foreach (UIElement child in SubMenu.Items) // this does not work!
    {
        HyperlinkButton hb = child as HyperlinkButton;
        if (hb != null && hb.NavigateUri != null)
        {
            if (hb.NavigateUri.ToString().Equals(e.Uri.ToString()))
            {
                VisualStateManager.GoToState(hb, "ActiveLink", true);
            }
            else
            {
                VisualStateManager.GoToState(hb, "InactiveLink", true);
            }
        }
    }

问题是,我似乎找不到一种方法来枚举ItemsCollection.Items中的实际UI元素。

有人知道怎么做或者一个可能的解决办法吗?

我可以提到,我想要做的是构建一个菜单和子菜单,将超链接显示为一种面包屑。

更新:最好的方法是,如果我能够以某种方式进入堆栈面板,因为这段代码似乎有效:

代码语言:javascript
复制
    foreach (UIElement child in LinksStackPanel.Children)
    {
        HyperlinkButton hb = child as HyperlinkButton;
        if (hb != null && hb.NavigateUri != null)
        {
            if (hb.NavigateUri.ToString().Equals(e.Uri.ToString()))
            {
                VisualStateManager.GoToState(hb, "ActiveLink", true);
            }
            else
            {
                VisualStateManager.GoToState(hb, "InactiveLink", true);
            }
        }
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-26 08:37:54

解决方案如下:

代码语言:javascript
复制
foreach (var item in SubMenu.Items)
{
    var hb = SubMenu.ItemContainerGenerator.ContainerFromItem(item).FindVisualChild<HyperlinkButton>();

    if (hb.NavigateUri.ToString().Equals(e.Uri.ToString()))
    {
        VisualStateManager.GoToState(hb, "ActiveLink", true);
    }
    else
    {
        VisualStateManager.GoToState(hb, "InactiveLink", true);
    }
}

扩展方法FindVisualChild:

代码语言:javascript
复制
public static T FindVisualChild<T>(this DependencyObject instance) where T : DependencyObject
{
    T control = default(T);

    if (instance != null)
    {

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(instance); i++)
        {
            if ((control = VisualTreeHelper.GetChild(instance, i) as T) != null)
            {
                break;
            }

            control = FindVisualChild<T>(VisualTreeHelper.GetChild(instance, i));
        }
    }

    return control;

}
票数 8
EN

Stack Overflow用户

发布于 2010-02-26 01:46:53

尝试使用ItemContainerGenerator.ContainerFromItem方法

代码语言:javascript
复制
foreach (var item in SubMenu.Items)
{ 
    var child = SubMenu.ItemContainerGenerator.ContainerFromItem(item);
    HyperlinkButton hb = child as HyperlinkButton; 
    // use hb
}
票数 2
EN

Stack Overflow用户

发布于 2013-06-17 15:21:10

来自Johan答案的FindVisualChild存在缺陷:遍历控件层次结构中的较低级别不会产生任何影响,因为他不检查递归调用的结果。

那是固定版本。

代码语言:javascript
复制
public static T FindVisualChild<T>(this DependencyObject instance) where T : DependencyObject
{
    T control = default(T);

    if (instance != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(instance); i++)
        {
            if ((control = VisualTreeHelper.GetChild(instance, i) as T) != null)
            {
                break;
            }

            if ((control = FindVisualChild<T>(VisualTreeHelper.GetChild(instance, i))) != null)
            {
                break;
            }
        }
    }

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

https://stackoverflow.com/questions/2336989

复制
相关文章

相似问题

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