2009-03-30 24 views
31

Tôi có một ListBox WPF thực sự đơn giản với SelectionMode được đặt thành Nhiều.Thay đổi kiểu hộp danh sách đã chọn và không tập trung để không bị mờ đi

<ListBox SelectionMode="Multiple" /> 

Khi ListBox mất tiêu điểm, thật khó để biết nội dung được chọn vì màu lựa chọn thay đổi từ màu xanh sang màu xám nhạt. Cách dễ nhất để thay đổi hành vi này để nó có màu xanh dương là gì?

Tôi biết nó có thể là một cái gì đó để làm với phong cách của ListItem, nhưng tôi không thể tìm thấy ở đâu.

Chúc mừng.

tương tự: WPF ListView Inactive Selection Color

+0

Cảm ơn bạn đã gọi cho Mice Micah, nhưng nó không hoàn toàn giống nhau, vì tôi đang nói về ListBox không phải ListView. Đó là lý do tại sao tôi không tìm thấy sự lừa đảo. Không nói rằng các giải pháp không làm việc cho cả hai mặc dù. – Ray

Trả lời

48

Tôi đã làm một cái gì đó như thế này bằng cách sử dụng sau đây trong một ResourceDictionary sáp nhập, nó có thể giúp bạn:

<Style TargetType="ListBoxItem"> 
    <Style.Resources> 
     <!--SelectedItem with focus--> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue" Opacity=".4"/> 
     <!--SelectedItem without focus--> 
     <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="LightBlue" Opacity=".4"/> 
    </Style.Resources> 
</Style> 
+1

Rất cám ơn vì điều này. –

+18

Sử dụng InactiveSelectionHighlightBrushKey thay vì ControlBrushKey từ .NET 4.5. –

+6

Điều này dường như không hoạt động đối với Windows-8 sử dụng các màu tĩnh trong các trình kích hoạt 'ControlTemplate' mặc định. Bạn sẽ phải lấy cơ sở 'Style' và chỉ định các cọ vẽ quá mức trong các trình kích hoạt đó hoặc cung cấp màu trực tiếp. http://stackoverflow.com/questions/16819577/setting-background-color-or-wpf-4-0-listbox/16820062#16820062 – Viv

4

Bạn có lẽ có thể giải quyết vấn đề của bạn bằng cách tái viết các mẫu, nhưng hãy thử điều này cho một bản vá dễ dàng.

<Style TargetType="ListViewItem"> 
    <Style.Resources> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Blue" /> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Blue" /> 
    </Style.Resources> 
</Style> 
10

Đây không phải là câu trả lời cho câu hỏi, nhưng tôi thấy điều này khi tôi đang tìm cách tắt các lựa chọn trong hộp danh sách của mình. Bằng cách sử dụng một dạng sửa đổi nhỏ của kỹ thuật uốn cong của Guyew & của Guyewey, hóa ra bạn có thể cho sự xuất hiện của không có lựa chọn nào trong hộp danh sách của bạn mà không thay thế các mục kiểm soát cơ bản hoặc bất cứ thứ gì như thế. Dưới đây là đoạn code tôi sử dụng:

<Grid.Resources> 
    <Style TargetType="ListBoxItem"> 
    <Style.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White" /> 
    </Style.Resources> 
    </Style> 
</Grid.Resources> 

Tôi cũng thấy trang sau MSDN hữu ích:

MSDN: SystemColors Members (System.Windows)

Thanks for the help, guys.

7

Một giải pháp hoàn chỉnh hơn sẽ có bàn chải mới đề cập đến HighlightColor:

<Style TargetType="ListBox"> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="ListBoxItem"> 
       <Style.Resources> 
        <SolidColorBrush x:Key="{x:Static Member=SystemColors.InactiveSelectionHighlightBrushKey}" 
            Color="{DynamicResource ResourceKey={x:Static Member=SystemColors.HighlightColorKey}}" /> 
       </Style.Resources> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

Điều này sẽ đảm bảo rằng nó sử dụng cùng một màu sắc và phù hợp với chủ đề hệ thống (ngay cả khi những thay đổi chủ đề hệ thống trong thời gian chạy, nhờ DynamicResource).

Nhân tiện, có vẻ như các phiên bản WPF gần đây không sử dụng "ControlBrush" cho mục này nữa, nhưng "InactiveSelectionHighlightBrush" thích hợp hơn.

+1

Điều này dường như không hoạt động trên Windows 10, bạn có thể xác minh xem điều này có vẫn nên làm việc? – skiwi

0

Tôi cũng gặp sự cố này. Nhưng tôi giải quyết điều này bằng cách sử dụng IsSynchronizedWithCurrentItem = "True":

<ListBox 
IsSynchronizedWithCurrentItem="True" /> 
0

Khi mục đã chọn của bạn trở nên mờ đi đó là vì sự kiểm soát của bạn mất tập trung logic của nó. Nhiều điều khiển có khả năng tập trung hợp lý cùng một lúc. Vì vậy, một giải pháp đơn giản cho điều này có thể là để cung cấp cho ListBox của bạn một FocusScope thông qua FocusManager.

<ListBox SelectionMode="Multiple" FocusManager.IsFocusScope="True"></ListBox> 
Các vấn đề liên quan