wpf 树景蓝调.我想选择一个项目 [英] wpf treeview blues. I want to select an item

查看:26
本文介绍了wpf 树景蓝调.我想选择一个项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试选择一个 TreeViewItem.现在,我可以访问包含的 TreeViewItem 并告诉它展开以便我可以选择它的孩子.如果它已经扩展了一切都很好,如果不是那么我运行这个代码:

I'm trying to select a TreeViewItem. Now, I have access to the containing TreeViewItem and have told it to expand so I can select its kid. If it's already expanded all is well, if it's not then I run this code:

EventHandler selector = new EventHandler(delegate
    {
        if (selectedDirectoryTreeItem.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
        {
            TreeViewItem want = selectedDirectoryTreeItem.ItemContainerGenerator.ContainerFromItem(dirWeWantSelected) as TreeViewItem;
            if (want == null)
                return;

                want.IsSelected = true;
            // selectedDirectoryTreeItem.ItemContainerGenerator.StatusChanged -= selector;
        }
    });
selectedDirectoryTreeItem.ItemContainerGenerator.StatusChanged += selector;  

所以我的问题是,为什么不选择?想要总是空的.我正在搜索互联网,寻找另一种方式来做到这一点,但如果有人能向我解释这一点会很酷

So my question is, why wont it select? want is always null. I'm scouring the interwebs looking for another way of doing this but it would be cool if somebody could explain this to me

推荐答案

感谢您的帮助,我想通了.好吧,无论如何它都有效,但我不完全确定为什么它之前没有......如果有人能告诉我它会很可爱......我有点结合了上面两个响应的元素,然后添加了一点点这行得通.出于某种原因,无论我做什么我都无法选择 TVI (TreeViewElement),如果它的父级尚未展开,即使父级 TVI 说它的内容已生成并且实际上有我可以遍历的内容.因此,我的解决方案是等待生成内容,然后遍历它们并找到我想要的内容.对我来说,我不能仅仅抓住一个容器,因为它的内容很奇怪.嗯.我的代码可以稍微重构一下,但这里是:(完美运行)

Thanks for the help, I figured it out. Well it works anyway but i'm not entirely sure why it didn't before... if anyone can tell me it would be lovely... I kinda combined elements of the two responses above and then added on a little bit to make it work. For some reason, no matter what i do I cant select the TVI (TreeViewElement) if its parent wasn't already expanded, even if the parent TVI said its contents were generated and, in fact, had contents i could iterate through. My solution was thus to wait for the contents to be generated and then itrate through them and find the one i wanted. It's really weird to me that I couldn't just grab a container given its contents. Meh. My code could stand to be refactored a little bit but here it is: (works perfectly)

public void listItemClickClick(object sender, RoutedEventArgs e) 
    {
        try
        {
            UserFile fil = (UserFile)(sender as ListBoxItem).DataContext;
            MessageBox.Show("to do: download stuff");
            return;
        }
        catch (InvalidCastException)
        {
        }
        try
        {
            dirWeWantSelected = (Directory)(sender as ListBoxItem).DataContext;
        }
        catch (InvalidCastException)
        {
            MessageBox.Show("this should never happen");
        }
        selectedDirectoryTreeItem.IsExpanded = true;
        TreeViewItem want = null;
        try
        {
            want = selectedDirectoryTreeItem.ItemContainerGenerator.ContainerFromItem(dirWeWantSelected) as TreeViewItem;
        }
        catch
        {
            MessageBox.Show("weird error");
        }
        if (want != null)
        {
            want.IsSelected = true;
        }
        else
        {
            selectedDirectoryTreeItem.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
        }
    }

    void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
    {
        if (selectedDirectoryTreeItem.ItemContainerGenerator.Status
            == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
        {
            selectedDirectoryTreeItem.ItemContainerGenerator.StatusChanged
                -= ItemContainerGenerator_StatusChanged;
            Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input,
                new Action(DelayedAction));
        }
    }

    void DelayedAction()
    {
        selectedDirectoryTreeItem.Items.MoveCurrentToFirst();
        Directory curr;
        do
        {
            curr = (Directory)selectedDirectoryTreeItem.Items.CurrentItem;
            if (curr.id == dirWeWantSelected.id)
            {
                curr.Selected = true;
                return;
            }
            selectedDirectoryTreeItem.Items.MoveCurrentToNext();
        }
        while (selectedDirectoryTreeItem.Items.CurrentItem != null);
    }

这篇关于wpf 树景蓝调.我想选择一个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆