【问题标题】:WPF: ListView Cannot Get Focus when Click in Blank AreaWPF:在空白区域单击时 ListView 无法获得焦点
【发布时间】:2020-04-20 08:49:23
【问题描述】:

ListView 只能在单击 listview 项目时获得焦点。当单击空白区域时,也是列表视图的一部分,无法获得焦点。

例子:

      <Grid>
            <ListView x:Name="lv" 
                      GotFocus="Lv_OnGotFocus"
                      LostFocus="Lv_OnLostFocus"
                      MouseEnter="Lv_OnMouseEnter">
                <ListViewItem>Foo</ListViewItem>
                <ListViewItem>Bar</ListViewItem>
            </ListView>
        </Grid>

在上面的代码中,我将事件处理程序绑定到列表视图而不是列表视图项。

  • 当光标在空白区域移动时,Lv_OnMouseEnter 处理程序被触发,这表明空白区域也是列表视图的一部分。
  • 在空白区域点击时,Lv_OnGotFocus没有被触发。没有获得焦点。
  • 当点击任何列表视图项目时,Lv_OnGotFocus 被触发。焦点得到了。
  • Lv_OnGotFocus 处理程序被移到 Grid 之外时,情况也是如此。

如何在点击列表视图的任何部分时获得焦点?

为什么我需要关注空白区域?

我正在列表视图中实现文件复制和粘贴功能,其中列表视图项绑定到磁盘上的文件。粘贴操作由附加到列表视图的 PreviewKeyDown 处理程序触发,其中检查了 Ctrl + V 按键。

如果文件夹为空,则列表视图为空。因此 PreviewKeyDown 处理程序不能被触发,作为 Lv_OnGotFocus 处理程序,在一个空文件夹中,而将文件复制到空文件夹意味着工作。

【问题讨论】:

    标签: c# wpf listview


    【解决方案1】:

    一个简单的解决方法是处理点击:

    <ListView PreviewMouseLeftButtonDown="ListView_PreviewMouseLeftButtonDown" ... />
    

    设置焦点

    void ListView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) =>
        (sender as ListBox)?.Focus();
    

    注意:这将导致GotFocus 在单击普通项目时被调用两次。

    【讨论】:

    • 它对我有用,但它没有解释为什么 ListView 无法通过自动点击获得焦点。
    猜你喜欢
    • 2015-12-04
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多