【问题标题】:WPF TreeView selecting next or previous items in codeWPF TreeView 在代码中选择下一个或上一个项目
【发布时间】:2013-12-04 21:03:57
【问题描述】:

我希望有上一个/下一个箭头来选择树视图中的项目。我有 3 个有子节点的父节点。父节点不会做任何事情,所以如果我在父节点 1 中的子节点的末尾,我希望下一个箭头选择父节点 1 中的第一个子节点。如果在父节点 2 的第一个节点上,则相反单击上一个将带我到最后一个子节点或父节点 1。

当前树视图的xaml

<TreeView x:Name="tvMessages" HorizontalAlignment="Left" Height="363" Margin="10,37,0,0" VerticalAlignment="Top" Width="312" SelectedItemChanged="tvMessages_SelectedItemChanged">
                <TreeViewItem x:Name="itemsCritical">
                    <TreeViewItem.Header>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="/FlashSystem/Images/Critical.png" Height="16px" Width="16px"/>
                            <TextBlock Margin="5,0" Text="Critical"/>
                        </StackPanel>
                    </TreeViewItem.Header>
                    <TreeViewItem.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image Source="/FlashSystem/Images/Message.png" Width="16px" Height="16px"/>
                                <TextBlock Margin="5,0" Text="{Binding Description}"/>
                                <TextBlock Text="{Binding ID}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding Specility}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding IssuedDate}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding Severity}" Visibility="Hidden"/>
                            </StackPanel>
                        </DataTemplate>
                    </TreeViewItem.ItemTemplate>
                </TreeViewItem>
                <TreeViewItem x:Name="itemsAlert">
                    <TreeViewItem.Header>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="/FlashSystem/Images/Alert.png" Height="16px" Width="16px"/>
                            <TextBlock Margin="5,0" Text="Alert"/>
                        </StackPanel>
                    </TreeViewItem.Header>
                    <TreeViewItem.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image Source="/FlashSystem/Images/Message.png" Width="16px" Height="16px"/>
                                <TextBlock Margin="5,0" Text="{Binding Description}"/>
                                <TextBlock Text="{Binding ID}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding Specility}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding IssuedDate}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding Severity}" Visibility="Hidden"/>
                            </StackPanel>
                        </DataTemplate>
                    </TreeViewItem.ItemTemplate>
                </TreeViewItem>
                <TreeViewItem x:Name="itemsInformational">
                    <TreeViewItem.Header>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="/FlashSystem/Images/Info.png" Height="16px" Width="16px"/>
                            <TextBlock Margin="5,0" Text="Informational"/>
                        </StackPanel>
                    </TreeViewItem.Header>
                    <TreeViewItem.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image Source="/FlashSystem/Images/Message.png" Width="16px" Height="16px"/>
                                <TextBlock Margin="5,0" Text="{Binding Description}"/>
                                <TextBlock Text="{Binding ID}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding Specility}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding IssuedDate}" Visibility="Hidden"/>
                                <TextBlock Text="{Binding Severity}" Visibility="Hidden"/>
                            </StackPanel>
                        </DataTemplate>
                    </TreeViewItem.ItemTemplate>
                </TreeViewItem>
            </TreeView>

【问题讨论】:

  • 假设所有节点都已折叠,TreeView 中已经发生了这种行为。如果您点击右箭头,一旦根节点将被展开。如果再按一次右箭头,将选择根节点的第一个节点。此外,如果你再次点击右箭头,根节点的第一个节点将被展开。这就是 TreeView 中右/左箭头的工作方式。一次他们展开另一次他们选择下一个...展开,选择下一个,展开,选择下一个...
  • 我想使用窗口上的实际按钮而不是箭头键来控制它
  • 我现在看到您在谈论带箭头的按钮,而我提到了键盘箭头。让我给你一个答案。评论允许有限数量的字符...

标签: c# wpf xaml treeview


【解决方案1】:

我会尝试模拟按键事件,看看它是否有效。

如果您模拟箭头键向下事件,TreeViewItem 将为您完成这项工作。它将自行扩展或将选择移动到其 Children[0] 项。

TreeViewItem 在内部侦听 KeyDown 并与 ItemContainerGenerator 一起查找 Children[0] 项目。

这是在 WPF 中模拟箭头键的方法:

var backKey = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Back);  
backKey.RoutedEvent = Keyboard.KeyDownEvent;  
InputManager.Current.ProcessInput(backKey);

你不需要返回键,你需要右箭头或左箭头,你仍然需要 InputManager 来处理输入:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多