Silverlight 4.0 再次隐藏和显示TreeView会修改选定的TreeView项目。为什么?

Silverlight 4.0 再次隐藏和显示TreeView会修改选定的TreeView项目。为什么?,silverlight-4.0,treeview,Silverlight 4.0,Treeview,我在SL4中有一个已经填充的树视图,并且选择了某个树视图项 正在做 treeview.Visibility=Visibility.Collapsed; 然后 treeview.Visibility=Visibility.Visible; 修改选定的树视图项。为什么?有没有办法避免这种情况 编辑2012.02.04 03:29 我已追查到问题的根源。这是我发现的(对我来说,令人惊讶的)结论:如果满足以下所有条件: 1) TreeView有两层(或两层以上)的深度 2) 我首先展开它的所有节点

我在SL4中有一个已经填充的树视图,并且选择了某个树视图项

正在做

treeview.Visibility=Visibility.Collapsed;
然后

treeview.Visibility=Visibility.Visible;
修改选定的树视图项。为什么?有没有办法避免这种情况

编辑2012.02.04 03:29

我已追查到问题的根源。这是我发现的(对我来说,令人惊讶的)结论:如果满足以下所有条件:

1) TreeView有两层(或两层以上)的深度

2) 我首先展开它的所有节点

3) 我开始在第二级选择一个节点,然后

4) (这是最奇怪的一个)我用来折叠并再次显示TreeView的按钮不是制表位

然后树视图在被折叠并再次显示后不会保留其选择

请下载复制问题的小型解决方案+示例 试试看

或者看看这两段代码:

<UserControl x:Class="PRJ.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" Loaded="UserControl_Loaded">

    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel Name="sp1">
            <!-- ################################################################### -->
            <!-- First, in the TreeView, expand TreeViewItems "a0", "a1" and "a2". -->
            <!-- Then, select "a0b0". -->
            <!-- Then, click the button twice. -->
            <!-- If you don't remove   IsTabStop="False"   from the following line of code, the TreeView reappears with "a1" selected !!! -->
            <!-- If you continue clicking the button, the selection shifts to "a1b0", "a2", and finally "a2b0". -->
            <!-- If you remove   IsTabStop="False"  , or change it to True, the TreeView works OK and keeps its selection. -->
            <!-- Isn't it odd, that the capability of the TreeView to keep its selection depends on whether the button used to hide and show the TreeView is a tab stop or not??? -->
            <Button Content="Hide/Show TreeView" Name="b1" Click="b1_Click" IsTabStop="False" />
            <!-- ################################################################### -->
            <sdk:TreeView Name="tv1" />
        </StackPanel>
    </Grid>
</UserControl>

名称空间PRJ
{
公共部分类主页面:UserControl
{
公共主页()
{
初始化组件();
}
私有void b1_单击(对象发送者,路由目标e)
{
if(tv1.Visibility==Visibility.Collapsed)
tv1.可见性=可见性.Visibility;
其他的
tv1.Visibility=Visibility.Collapsed;
}
已加载私有void UserControl_(对象发送方,RoutedEventArgs e)
{

for(int a=0;a使用一个全新的项目和一个包含字符串列表的树状视图进行了测试。在折叠并使其再次可见后,所选项目从未丢失。

这很奇怪。你在使用SL4吗?是的。我将发布一个包含示例解决方案+项目的zip文件的链接。谢谢。很遗憾,我正在下载(从我拥有的东西中移除一些东西-一个相对较大的项目-),我不知道该删除什么,以消除问题,而如果我开始一个全新的项目,我不知道该添加什么,以使问题出现。因此,你是对的,对于一个新的项目,这不会发生。我必须找出是什么,在我的项目中,导致这一情况发生。我毫不怀疑的是,我的设置,只是正如我所说的,调整可见性,选择转到另一个TreeViewItem。我将继续尝试。谢谢。请查看我的2012.02.04 03:29编辑,并得出惊人的结论。好吧。我现在可以确认您看到的内容。虽然按钮不是制表位(如您在XAML中的IsTabStop=“False”所述),SelectedItem会一直更改,直到它升到树的底部。确实很奇怪。如果设置IsTabStop=“True”或将其删除,则不会再发生这种情况,并且选择会被保留。这对您有足够的帮助吗?我发现了这一点(它不会升到树的底部。规则更复杂)。问题是,由于外观的原因,我不希望该按钮成为制表位(因为它在显示时会绘制一个额外的边框,并且具有焦点)。我最终以另一种方式绕过了该问题(在隐藏树之前存储所选内容-更改到另一页-然后再重新创建)。感谢您抽出时间。
namespace PRJ
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void b1_Click(object sender, RoutedEventArgs e)
        {
            if (tv1.Visibility==Visibility.Collapsed)
                tv1.Visibility=Visibility.Visible;
            else
                tv1.Visibility=Visibility.Collapsed;
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            for (int a=0;a<3;a++)
            {
                TreeViewItem    tvia    =new TreeViewItem();
                tvia.Header                =String.Format("a{0}",a);
                for (int b=0;b<2;b++)
                {
                    TreeViewItem    tvib    =new TreeViewItem();
                    tvib.Header                =String.Format("a{0}b{1}",a,b);
                    tvia.Items.Add(tvib);
                } // for b
                tv1.Items.Add(tvia);
            } // for a
        }
    }
}