Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取两个项目之间的所有TreeViewItem_C#_Wpf_Treeview - Fatal编程技术网

C# 如何获取两个项目之间的所有TreeViewItem

C# 如何获取两个项目之间的所有TreeViewItem,c#,wpf,treeview,C#,Wpf,Treeview,我有一个WPF树视图,它可视化了一个简单的层次结构,如下所示: > item1 item1_1 > item1_2 item1_2_1 item2 item3 在这里,每个项可以有任意数量的子项。给定任意一对项目(例如item1_1和item3),我如何获得中间的所有项目(即item1_2、item1_2_1和item3)?未优化但工作正常 <Window x:Class="WpfApplication5.MainWindow"

我有一个WPF树视图,它可视化了一个简单的层次结构,如下所示:

> item1
     item1_1
   > item1_2
        item1_2_1
  item2
  item3

在这里,每个项可以有任意数量的子项。给定任意一对项目(例如
item1_1
item3
),我如何获得中间的所有项目(即
item1_2
item1_2_1
item3
)?

未优化但工作正常

<Window x:Class="WpfApplication5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication5"
        Title="MainWindow" Height="300" Width="800" FontSize="25">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
            <TreeViewItem Header="A">
                <TreeViewItem Header="AA">
                    <TreeViewItem Header="AAA"/>
                    <TreeViewItem Header="AAB"/>
                </TreeViewItem>
                <TreeViewItem Header="AB"/>
            </TreeViewItem>
            <TreeViewItem Header="B">
                <TreeViewItem Header="BA"/>
                <TreeViewItem Header="BB">
                    <TreeViewItem Header="BBA"/>
                    <TreeViewItem Header="BBB"/>
                </TreeViewItem>
            </TreeViewItem>
        </TreeView>
        <StackPanel Grid.Column="1">
            <TextBlock Name="txt1"/>
            <TextBlock Name="txt2"/>
            <ListBox Name="lst" ></ListBox>
        </StackPanel>
    </Grid>
</Window>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private object itm1;
    private object itm2;

    private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (itm1 == null || (itm1 != null && itm2 != null))
        {
            itm1 = e.NewValue;
            itm2 = null;
            txt1.Text = itm1.ToString();
            txt2.Text = "";

            return;
        }

        itm2 = e.NewValue;
        txt2.Text = itm2.ToString();

        var tree = sender as ItemsControl;
        firstFound = false;
        secondFound = false;
        between = new List<object>();

        checkCollection(tree);

        lst.Items.Clear();
        foreach (var itm in between)
        {
            lst.Items.Add(itm.ToString());
        }

    }

    bool firstFound = false;
    bool secondFound = false;
    List<object> between = new List<object>();
    private void checkCollection(object ctrl)
    {
        if (secondFound)
            return;

        if (!firstFound && (ctrl == itm1 || ctrl == itm2))
        {
            firstFound = true;
        }
        else if (firstFound && (ctrl == itm1 || ctrl == itm2))
        {
            secondFound = true;
            return;
        }

        if (firstFound)
        {
            between.Add(ctrl);
        }

        var itmsCtrl = ctrl as ItemsControl;
        foreach (var itm in itmsCtrl.Items)
        {
            checkCollection(itm);
        }
    }
}

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有对象itm1;
私有对象itm2;
私有无效树查看\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
if(itm1==null | |(itm1!=null&&itm2!=null))
{
itm1=e.NewValue;
itm2=null;
txt1.Text=itm1.ToString();
txt2.Text=“”;
返回;
}
itm2=e.NewValue;
txt2.Text=itm2.ToString();
var tree=发送方作为ItemsControl;
firstFound=false;
secondFound=false;
between=新列表();
支票收集(树);
lst.Items.Clear();
foreach(介于两者之间的var itm)
{
lst.Items.Add(itm.ToString());
}
}
bool firstFound=false;
bool secondFound=false;
列表之间=新列表();
私有void checkCollection(对象ctrl)
{
如果(第二次发现)
返回;
如果(!firstFound&(ctrl==itm1 | | ctrl==itm2))
{
firstFound=true;
}
else if(firstFound&(ctrl==itm1 | | ctrl==itm2))
{
secondFound=true;
返回;
}
如果(首次发现)
{
添加(ctrl);
}
var itmsCtrl=ctrl作为ItemsControl;
foreach(itmsCtrl.项目中的var itm)
{
支票收款(itm);
}
}
}

从itemssource而不是从treeview本身获取这些项目不是更容易吗?