You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ListBox向上选择项时Tooltip文本不更新问题求助

问题分析与解决方案

问题根源

你的代码逻辑依赖SelectedItems集合的最后一项来更新Tooltip,但在MultiSimple选择模式下:

  • 点击未选中的项时,它会被加入SelectedItems,此时取最后一项是对的;
  • 点击已选中的项时,它会从SelectedItems中移除,这时你取的是集合里剩下的最后一项,而非当前点击的项,所以Tooltip不会更新到当前项的日期。
    另外,Click事件无法直接获取到当前点击的具体项,只能操作选中集合,这也是核心问题之一。

解决办法

  1. 改用MouseDown事件,通过HitTest方法获取鼠标点击位置对应的列表项,精准定位当前点击的项;
  2. 提前缓存文件的名称和最后修改日期,避免每次点击都重复读取文件属性,提升性能。

修改后的完整代码

#MAIN WINDOW
$form = New-Object System.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(620,400)
$form.StartPosition = "CenterScreen"
$form.FormBorderStyle = "Sizable"

#SOURCE FILES FOLDER
$sourceFolder = "C:\Users\me\Downloads"

#FILE LISTBOX
$sourceListBox = New-Object System.Windows.Forms.ListBox
$sourceListBox.SelectionMode = "MultiSimple"
$sourceListBox.Size = New-Object System.Drawing.Size(250,310)
$sourceListBox.Location = New-Object System.Drawing.Point(20,30)

#SEARCH FOR FILES - 缓存名称和最后修改日期
$sourceFiles = Get-ChildItem -Path $sourceFolder -Filter "*.pdf" | Sort-Object LastWriteTime -Descending | Select-Object Name, LastWriteTime
# 将Name作为列表项显示
$sourceListBox.Items.AddRange($sourceFiles.Name)
# 把完整文件对象存在Tag里,方便后续快速获取
$sourceListBox.Tag = $sourceFiles
$form.Controls.Add($sourceListBox)

#TOOLTIP
$toolTip = New-Object System.Windows.Forms.ToolTip

#UPDATE TOOLTIP FROM CLICKED ITEM
function ShowLastModifiedDateTooltip {
    param($clickedItem)
    if ($clickedItem -ne $null) {
        # 从缓存的文件列表中找到对应的项
        $fileInfo = $sourceListBox.Tag | Where-Object { $_.Name -eq $clickedItem }
        $lastModifiedDate = $fileInfo.LastWriteTime.ToString("dd-MM-yyyy")
        $toolTip.SetToolTip($sourceListBox, "Modified: $lastModifiedDate")
    }
}

#HANDLE MOUSE DOWN EVENT INSTEAD OF CLICK
$sourceListBox.Add_MouseDown({
    $hitTestInfo = $sourceListBox.HitTest([System.Drawing.Point]$_.X, $_.Y)
    if ($hitTestInfo.Item -ne $null) {
        ShowLastModifiedDateTooltip -clickedItem $hitTestInfo.Item
    }
})
$form.ShowDialog()

关键修改说明

  • 提前缓存了文件的Name和LastWriteTime,存在ListBox的Tag属性中,避免每次点击都调用Get-Item读取文件系统;
  • 用MouseDown事件替换Click事件,通过HitTest获取当前点击的具体项,不管该项是否被选中,都能正确获取到它的信息;
  • 直接根据点击的项去缓存中查找对应的日期,保证tooltip显示的是当前点击项的信息。

内容的提问来源于stack exchange,提问作者Tiago Moreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:12:46