WPF ListView失去焦点

10

我在WPF中使用ListView控件时遇到了一些奇怪的行为。

我们正在用C#开发应用程序。

我创建了一个ListView,并添加了一些项,将SelectedIndex设置为其中某个索引。然后我点击ListView上的任何位置,在键盘上按上/下箭头键进行导航,一切都运行得很完美。但是如果我将焦点移动到另一个控件,然后尝试通过编程方式将焦点返回到ListView控件,则会出现问题。

ListView获得焦点,但是当我尝试使用键盘导航时,当前选择将被取消,第一个项目将被选中,并且导航将从列表中的第一个项目开始。

我通过调用其.Focus()方法将焦点设置为ListView控件。

看起来即使ListView控件处于焦点状态,但实际上没有项目处于焦点状态,即使SelectedIndex具有某些有效值。

请帮帮我!如何通过编程方式将焦点设置为ListView控件以防止这种行为?

我发现我的ListView的选定索引与聚焦项不同。

在selectedindex_changed事件中,我将所选索引设置为固定项(5),但当我按箭头键时,该项会改变。这意味着所选索引固定为5,但当前项(以点边框显示)移到了箭头键位置。

无论如何,我的selecteditem都固定为5,但是我的scrollviews移动到当前项的位置。

此代码位于listView1_SelectionChanged中:

listView1.SelectionMode = SelectionMode.Single;
listView1.SelectedIndex = 5;

我的ListView视图已被修改:

<ListView.View>
<GridView AllowsColumnReorder="True">
</GridView>
</ListView.View>

    <l:PlainView x:Key="tileView"
            ItemTemplate="{StaticResource centralTile}"
            ItemHeight="120" ItemWidth="130" />

我不再了解这个问题。

谢谢。


在任何GUI/框架/语言中,调用.Focus()通常都是一个不好的实践,不是吗? - user215054
1
嘿,你找到这个问题的解决方案了吗?我也遇到了完全相同的问题,但是无法解决! - Mark Pearl
那么,你还有什么其他方法可以设置焦点呢? - Sam
1个回答

7

ListView 可能和 ListBox 一样存在一个问题,即它可以独立于其项目而拥有焦点。

当我想要将焦点放在 ListBox 上时,我需要执行以下操作:

listBox1.Focus();
if (listBox1.Items.Count > 0)
{
    var index = listBox1.SelectedIndex;
    if (index < 0) index = 0;

    var item = listBox1.ItemsContainerGenerator
                   .ContainerFromIndex(index) as ListBoxItem;
    item.Focus();
}

所以这个代码会聚焦在ListBox上,如果ListBox中包含任何项,则会将焦点放在所选项或第一个选中的项上。

我从未在WPF中使用过ListView,但是可以假设您可以使用ListView代替ListBox,并在ListBoxItem的位置上使用ListViewItem来拼凑出类似的方法。


1
我建议在ListBox/ListView上设置Focusable=False,这样它就无法获得独立焦点,然后只需使用以下代码:if (uiListBox.SelectedItem != null){(uiListBox.SelectedItem as UIElement).Focus();} - rmoore
4
是的,我曾玩过在宿主控件上设置Focusable=False,但是当列表为空时会出现一些奇怪的焦点问题。有时您仍希望在空列表中进行焦点操作,以便可以捕获特定于列表的快捷键等。也许将Focusable绑定到Items.Count并使用触发器会更好。 - Matt Hamilton
ListView是ListBox的子控件,所以你的示例对我来说非常有效。唯一改变的是当(index < 0)时,我也将listBox1.SelectedIndex设置为0,以便焦点和选定项匹配。 - Sam
2
@rmoore,uiListBox.SelectedItem可能甚至不是UIElement。至少在我的情况下不是。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接