2009-08-09 33 views
8

Tôi có WPF ListView với chế độ xem GridView và tôi muốn xóa bất kỳ dấu vết nào của hàng nổi bật.Xóa WPF ListView/GridView làm nổi bật chrome

này mảnh hữu ích của mã có thể được tìm thấy trong một câu trả lời trên trang web này:

 <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="Control.Focusable" Value="False"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="{x:Null}" /> 
       <Setter Property="BorderBrush" Value="{x:Null}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 

Tuy nhiên, trong khi sự thay đổi này giúp bạn loại bỏ hầu hết các điểm nhấn, nó không loại bỏ các thanh ngang mà vẫn xuất hiện khi di chuyển chuột qua hàng ListView. Làm thế nào để loại bỏ nó?

Tôi đã xử lý vấn đề tương tự liên quan đến Nút và tìm thấy giải pháp thay đổi mẫu Nút bằng cách xóa chrome của nó.

Trong trường hợp này của ListView/GridView Tôi không thể tìm thấy chrome và mẫu tương ứng để thay đổi.

Trả lời

14

Nếu bạn có Windows SDK được cài đặt, bạn có thể tìm ra nguồn XAML cho tất cả các phong cách mặc định (giả sử bạn cài đặt các mẫu) tại:

% ProgramFiles% \ Microsoft SDK \ Windows \ v6.1 \ Samples \ WPFSamples.zip

Tệp zip chứa thư mục Lõi chứa AeroTheme, LunaTheme v.v ... chứa nguồn cho kiểu mặc định. Thật không may những tập tin này là khá lớn (~ 8500 dòng cho Aero) và không phải là rất tốt cấu trúc hoặc định dạng (IMO).

Việc kiểm soát mặc định mẫu cho một ListViewItem trông như thế này:

<ControlTemplate TargetType="{x:Type ListViewItem}"> 
    <Border CornerRadius="2" SnapsToDevicePixels="True" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      Background="{TemplateBinding Background}"> 
    <Border Name="InnerBorder" CornerRadius="1" BorderThickness="1"> 
     <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition MaxHeight="11" /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <Rectangle Name="UpperHighlight" Visibility="Collapsed" Fill="#75FFFFFF" /> 
     <GridViewRowPresenter Grid.RowSpan="2" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
     </Grid> 
    </Border> 
    </Border> 

    <ControlTemplate.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Background" Value="{StaticResource ListItemHoverFill}" /> 
     <Setter Property="BorderBrush" Value="#FFCCF0FF" /> 
     <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" /> 
    </Trigger> 

    <Trigger Property="IsSelected" Value="True"> 
     <Setter Property="Background" Value="{StaticResource ListItemSelectedFill}" /> 
     <Setter Property="BorderBrush" Value="#FF98DDFB" /> 
     <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#80FFFFFF" /> 
     <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" /> 
     <Setter TargetName="UpperHighlight" Property="Fill" Value="#40FFFFFF" /> 
    </Trigger> 

    <MultiTrigger> 
     <MultiTrigger.Conditions> 
     <Condition Property="IsSelected" Value="True" /> 
     <Condition Property="Selector.IsSelectionActive" Value="False" /> 
     </MultiTrigger.Conditions> 

     <Setter Property="Background" Value="{StaticResource ListItemSelectedInactiveFill}" /> 
     <Setter Property="BorderBrush" Value="#FFCFCFCF" /> 
    </MultiTrigger> 

    <MultiTrigger> 
     <MultiTrigger.Conditions> 
     <Condition Property="IsSelected" Value="True" /> 
     <Condition Property="IsMouseOver" Value="True" /> 
     </MultiTrigger.Conditions> 

     <Setter Property="Background" Value="{StaticResource ListItemSelectedHoverFill}" /> 
     <Setter Property="BorderBrush" Value="#FF98DDFB" /> 
    </MultiTrigger> 

    <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
    </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

đặt cược tốt nhất của bạn để loại bỏ tất cả làm nổi bật có lẽ là để thay thế cho ControlTemplate với bạn sở hữu mà chỉ bao gồm các GridViewRowPresenter (có thể trong một biên giới duy nhất) . Đừng quên bao gồm Trình kích hoạt làm xám các mục khi điều khiển bị tắt.

+0

Làm nổi bật trên phải là nó! Tôi đã nhìn vào mẫu ở đây: http://msdn.microsoft.com/en-us/library/ms788717.aspx và vì nó phải cho một chủ đề khác nhau, tôi không thể giải thích thanh. – Tony

+0

Tôi có thể xác nhận rằng hình chữ nhật UpperHighlight là thủ phạm. Cảm ơn! – Tony

+2

Tuyệt vời ... chỉ trong WPF tôi đã phải hoàn toàn ghi đè một phong cách để thoát khỏi một yếu tố nổi bật duy nhất. – aqua

0

Sử dụng mã của bạn, tôi hoàn toàn không thấy bất kỳ dòng nào. Chủ đề mặc định của bạn là gì? Luna, Aero, v.v.? Nó có thể là của bạn là khác với tôi, do đó một sự khác biệt trong chrome. Có bất kỳ cài đặt cụ thể nào khác trên ListView của bạn không?

Style Snooper hoặc Show Me The Template có thể giúp bạn theo dõi phần tử trực quan chịu trách nhiệm về dòng bạn đang xem. Bạn cũng có thể quan tâm re-templatingListView để nhận được hiệu ứng bạn muốn.

+0

Đây là chủ đề của Vista, tôi tin rằng đó là Aero vì tôi có hiệu ứng kính. Thật vậy, mọi người trên XP không thấy thanh nổi bật. – Tony

8

Tôi không phải là ở phía trước của một máy tính Windows để kiểm tra này ngay bây giờ nhưng tôi đã có một vấn đề tương tự với listboxes mà tôi cố định bằng cách đặt đoạn mã sau vào Window.Resources tôi

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 

Không chắc chắn nếu nó sẽ làm việc với listview của bạn mặc dù.

+1

Một số blog và anwers trỏ đến phương pháp này nhưng, vì lý do nào đó, nó không bao giờ làm việc cho tôi. – Tony

+3

Cảm ơn! Điều này làm việc cho tôi khi tôi đặt nó trong tài nguyên cửa sổ của tôi với Style targetType = "ListViewItem". Tôi cũng đã thêm một dòng để thiết lập SystemColors.HighlightTextBrushKey thành SystemColors.WindowTextColor nếu không để ngăn chặn màu văn bản của tôi chuyển sang màu nền (và do đó biến mất). –

+0

Đối với tôi, nó hoạt động trên ListView với KHÔNG GridView. Nhưng KHÔNG với GridView. – Paparazzi

Các vấn đề liên quan