ListBox向上选择项时Tooltip文本不更新问题求助
问题分析与解决方案
问题根源
你的代码逻辑依赖SelectedItems集合的最后一项来更新Tooltip,但在MultiSimple选择模式下:
- 点击未选中的项时,它会被加入
SelectedItems,此时取最后一项是对的; - 点击已选中的项时,它会从
SelectedItems中移除,这时你取的是集合里剩下的最后一项,而非当前点击的项,所以Tooltip不会更新到当前项的日期。
另外,Click事件无法直接获取到当前点击的具体项,只能操作选中集合,这也是核心问题之一。
解决办法
- 改用
MouseDown事件,通过HitTest方法获取鼠标点击位置对应的列表项,精准定位当前点击的项; - 提前缓存文件的名称和最后修改日期,避免每次点击都重复读取文件属性,提升性能。
修改后的完整代码
#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
相关产品推荐
相关产品推荐

