如何在WPF中使用上下箭头键来移动treeviewitem的选择。

12 浏览
0 Comments

如何在WPF中使用上下箭头键来移动treeviewitem的选择。

我们为TreeView控件创建了一个HierarchicalDataTemplate。我们可以使用鼠标点击树项来改变选择。现在,我们希望使用键盘的上下箭头键来上下移动选择。但是似乎无法工作。我在Google和Stackoverflow上搜索了很多,但都失败了。

所以我为此创建了一个新的线程,请你能帮我一些忙吗?谢谢。


    
        
            
                
                
            
            
                
            
            
            
        
    

另一个问题是,我可以使用鼠标点击TextBlock来选择项,但当我使用鼠标点击CheckBox时,项无法被选择。有没有办法让TreeView项在点击CheckBox时也被选中?

我将模板应用到TreeView的方式如下:


public class DataAccessor : DataTemplateSelector
{
    public DataAccessor()
    {
        Init();
    }
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var element = container as FrameworkElement;
        var template = element.FindResource("My_data_template") as DataTemplate;
        return template;
    }
    ......
}

谢谢。

0
0 Comments

问题原因:在WPF treeview中,使用箭头键进行导航时遇到问题,发现问题是复选框获取了焦点。

解决方法:将复选框的"Focusable"属性设置为False,这样就可以按预期在treeview中进行导航。

<CheckBox Focusable="False" ... />

不要因为这里的点赞数不多而感到沮丧。这个方法是有效的。将HierarchicalDataTemplate中的所有控件的Focusable属性都设置为False。这样还可以选择整个节点,而不仅仅是部分节点。

0
0 Comments

问题出现的原因是用户控件无法将上下键按下的事件传递给树状视图控件。解决方法可以参考以下链接中的内容:Keyboard shortcuts in WPF

以下是解决方法的示例代码:

private void UserControl_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Up || e.Key == Key.Down)
    {
        e.Handled = true;
        TreeViewItem current = treeView.SelectedItem as TreeViewItem;
        if (current != null)
        {
            TreeViewItem nextItem = null;
            if (e.Key == Key.Up)
            {
                nextItem = current.PreviouesVisibleSibling();
                if (nextItem == null)
                {
                    nextItem = current.Parent as TreeViewItem;
                }
            }
            else if (e.Key == Key.Down)
            {
                nextItem = current.NextVisibleSibling();
                if (nextItem == null)
                {
                    TreeViewItem parent = current.Parent as TreeViewItem;
                    while (parent != null)
                    {
                        nextItem = parent.NextVisibleSibling();
                        if (nextItem != null)
                        {
                            break;
                        }
                        parent = parent.Parent as TreeViewItem;
                    }
                }
            }
            if (nextItem != null)
            {
                nextItem.IsSelected = true;
                nextItem.BringIntoView();
            }
        }
    }
}

在用户控件的`KeyDown`事件中,判断按下的键是否是上下键。如果是上下键,则将`e.Handled`设置为`true`,以防止事件继续传递。然后获取当前选中的树状视图项,根据按下的键选择下一个可见的兄弟项或父项中的下一个可见兄弟项,并将其设为选中状态,并将其滚动到视图中。

希望这些信息能帮助到你解决问题。

0