首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF ListBox 正確以程式碼設定選取項目:附加屬性 GotFocus 方案

     編輯:關於.NET

問題場景

ListBox.ItemTemplate 內含 TextBox 等可聚焦控件時,滑鼠點擊項目內的控件,ListBoxItem 不會自動被選取(焦點被子控件捕獲),導致焦點與選取狀態不一致。

失敗嘗試:PreviewMouseDown

雖可在 PreviewMouseDown 強制選取,但會提前觸發 LostFocus 破壞驗證邏輯(驗證通常在 LostFocus 執行)。

正確方案:附加屬性監聽 GotFocus

於項目容器(TextBox)取得焦點時,向上尋找視覺樹中的 ListBoxItem 並設定 IsSelected = true。

核心程式碼

public static class ListBoxService
{
    public static readonly DependencyProperty AutoSelectProperty =
        DependencyProperty.RegisterAttached("AutoSelect", typeof(bool), typeof(ListBoxService),
            new PropertyMetadata(OnAutoSelectChanged));

    private static void OnAutoSelectChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (d is UIElement element)
        {
            if ((bool)e.NewValue) element.GotFocus += OnElementGotFocus;
            else element.GotFocus -= OnElementGotFocus;
        }
    }

    private static void OnElementGotFocus(object sender, RoutedEventArgs e)
    {
        if (e.OriginalSource is DependencyObject src)
        {
            var item = src.FindAncestor<ListBoxItem>();
            if (item != null) item.IsSelected = true;
        }
    }
}

// FindAncestor 擴充方法略(視覺樹向上搜尋)

全域啟用:App.xaml 樣式

<Application.Resources>
    <Style TargetType="{x:Type ListBox}">
        <Setter Property="local:ListBoxService.AutoSelect" Value="True" />
    </Style>
</Application.Resources>

零侵入式套用至全專案所有 ListBox,解決焦點與選取不同步問題,且不干擾驗證流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved