2009-08-09 8 views
8

Mam ListView WPF z widoku GridView i chcę usunąć wszelkie ślady podświetlenia wiersza.Usuwanie podświetlenia ListView/GridView WPF chrome

Ten przydatny kawałek kodu można znaleźć w jednej odpowiedzi na tej stronie:

 <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> 

Jednakże, o ile zmiana ta pomaga usunąć większość z podświetleniem, nie usuwa paska poziomego, że nadal jest wyświetlany, gdy mysz przesuwa się nad wierszem ListView. Jak mogę go usunąć?

Mam do czynienia z podobnym problemem z udziałem przycisku Button i znalazłem rozwiązanie, które zmienia szablon przycisku, usuwając jego chrome.

W tym przypadku ListView/GridView nie mogę znaleźć odpowiedniego szablonu i szablonu do zmiany.

Odpowiedz

14

Jeśli masz zainstalowany system Windows SDK, można znaleźć źródło XAML dla wszystkich stylów domyślnych (zakładając, że zainstalowane próbek) w:

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

Plik zip zawiera folder Core zawierający AeroTheme, LunaTheme itp., Który zawiera źródło dla domyślnych stylów. Niestety te pliki są dość duże (~ 8500 linii dla Aero) i niezbyt dobrze uporządkowane lub sformatowane (IMO).

Szablon domyślny kontrola na ListViewItem wygląda następująco:

<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> 

Najprościej do usuwania wszystkich podświetlanie jest prawdopodobnie zastąpić ControlTemplate ze jesteś właścicielem, który właśnie zawiera GridViewRowPresenter (być może w jednym Graniczna) . Nie zapomnij dołączyć wyzwalacza, który szarości elementów, gdy kontrola jest wyłączona.

+0

Najważniejszym wydarzeniem musi być to! Patrzyłem na szablon tutaj: http://msdn.microsoft.com/en-us/library/ms788717.aspx i ponieważ musi to być dla innego tematu, nie mogłem wytłumaczyć paska. – Tony

+0

Mogę potwierdzić, że przyczyną problemu był prostokąt UpperHighlight. Dzięki! – Tony

+2

Niesamowite ... tylko w WPF musiałem całkowicie przesłonić styl, aby pozbyć się pojedynczego elementu wyróżniającego. – aqua

0

Używając kodu, nie widzę żadnej linii. Jaki jest teraz Twój domyślny motyw? Luna, Aero, itp.? Możliwe, że twój jest inny niż mój, a zatem różnica w chromie. Czy są jakieś inne szczególne ustawienia na twoim ListView?

Style Snooper lub Show Me The Template może pomóc w wyśledzeniu elementu wizualnego odpowiedzialnego za wyświetlaną linię. Możesz być także zainteresowany re-templating swój ListView, aby uzyskać pożądany efekt.

+0

Jest to motyw Vista, uważam, że jest to Aero, ponieważ mam efekty szklane. Rzeczywiście, ludzie na XP nie widzą paska podświetlenia. – Tony

8

nie jestem przed komputerem z systemem Windows, aby przetestować to teraz, ale miałem podobny problem z listboxes które stały umieszczając następujące do moich Window.Resources

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

Nie wiem, czy to będzie działać z twoim listview chociaż.

+1

Kilka blogów i anwersów wskazuje na tę metodę, ale z jakiegoś powodu nigdy nie zadziałało to dla mnie. – Tony

+3

Dzięki! To działało dla mnie, gdy umieściłem go w moich zasobach okna za pomocą Style targetType = "ListViewItem". Dodałem również linię, aby ustawić SystemColors.HighlightTextBrushKey na SystemColors.WindowTextColor w przeciwnym razie, aby uniemożliwić zmianę koloru tekstu na kolor tła (i tym samym zniknięcie). –

+0

Dla mnie działa na ListView z gridviewOUT. Ale NIE z Gridview. – Paparazzi