Mam prosty ListView WPF i proste pytanie:
Czy można wyłączyć zaznaczanie, aby po kliknięciu wiersza przez użytkownika wiersz nie był podświetlony?
Chciałbym, aby po kliknięciu wiersz 1 wyglądał jak wiersz 0.
Ewentualnie powiązane: czy mogę zmienić wygląd wskaźnika najechania / zaznaczenia? Na przykład. aby zastąpić niebieski wygląd gradientu po najechaniu kursorem (linia 3) na niestandardowy jednolity kolor. Znalazłem to i to niestety nie pomaga.
(Osiągnięcie tego samego bez używania ListView jest również dopuszczalne. Chciałbym tylko móc używać przewijania logicznego i wirtualizacji interfejsu użytkownika, tak jak robi to ListView)
XAML dla ListView to:
<ListView Height="280" Name="listView">
<ListView.Resources>
<!-- attempt to override selection color -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightColorKey}"
Color="Green" />
</ListView.Resources>
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
<!-- more columns -->
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
Odpowiedzi:
Zgodnie z komentarzem Martina Konicka, aby w najprostszy sposób całkowicie wyłączyć selekcję pozycji:
Jeśli jednak nadal potrzebujesz funkcjonalności ListView, na przykład możliwości wybrania elementu, możesz wizualnie wyłączyć stylizację wybranego elementu, tak jak poniżej:
Możesz to zrobić na wiele sposobów, od zmiany ControlTemplate ListViewItem do po prostu ustawienia stylu (znacznie łatwiej). Możesz utworzyć styl dla ListViewItems przy użyciu ItemContainerStyle i „wyłączyć” pędzel tła i obramowania, gdy jest zaznaczony.
Ponadto, jeśli nie masz innego sposobu powiadamiania użytkownika o wybraniu elementu (lub tylko do testowania), możesz dodać kolumnę reprezentującą wartość:
źródło
BasedOn="{StaticResource {x:Type ListViewItem}}"
więc nie przesłaniało to reszty moich stylów siatki, ale myślę również, że Twój komentarz powinien być zaakceptowaną odpowiedziąOdpowiedź Moore'a nie działa, a strona tutaj:
Określanie koloru zaznaczenia, wyrównania zawartości i koloru tła dla elementów w ListBox
wyjaśnia, dlaczego nie może działać.
Jeśli widok listy zawiera tylko tekst podstawowy, najprostszym sposobem rozwiązania problemu jest użycie przezroczystych pędzli.
Spowoduje to niepożądane wyniki, jeśli komórki widoku listy zawierają kontrolki, takie jak komboksy, ponieważ zmienia to również ich kolor. Aby rozwiązać ten problem, musisz ponownie zdefiniować szablon kontrolki.
źródło
Ustaw styl każdego ListViewItem tak, aby Focusable był ustawiony na false.
źródło
Oto domyślny szablon ListViewItem z programu Blend:
Domyślny szablon ListViewItem:
Po prostu usuń wyzwalacz IsSelected i IsSelected / IsSelectionActive MultiTrigger, dodając poniższy kod do swojego stylu w celu zastąpienia domyślnego szablonu, a po zaznaczeniu nie będzie żadnych zmian wizualnych.
Rozwiązanie umożliwiające wyłączenie zmian wizualnych właściwości IsSelected:
źródło
Najłatwiejszy sposób, jaki znalazłem:
źródło
ListView.ItemContainerStyle
!W nawiązaniu do powyższego rozwiązania ... użyłbym MultiTriggera, aby umożliwić podświetleniom MouseOver kontynuowanie pracy po wybraniu, tak aby styl Twojego ListViewItem był następujący:
źródło
Okej, trochę za późno na mecz, ale żadne z tych rozwiązań nie spełniło moich oczekiwań. Te rozwiązania mają kilka problemów
Chciałem ListView z nagłówkami grupowania, a każdy ListViewItem powinien być po prostu `` informacyjny '' bez zaznaczania lub najechania kursorem, ale ListViewItem ma w nim przycisk, który chcę, aby można go było kliknąć i najechać kursorem.
Tak więc naprawdę chcę, aby ListViewItem w ogóle nie był ListViewItem, więc przejechałem ControlTemplate ListViewItem i po prostu uczyniłem go prostym ContentControl.
źródło
Jedną z właściwości widoku listy jest
IsHitTestVisible
. Odznacz to.źródło
IsHitTestVisible
przycisku nie można kliknąć. To wygląda jakIsEnabled = false;
To jest dla innych, którzy mogą napotkać następujące wymagania:
Jeśli jesteś podobny do mnie (korzystasz z WPF z .NET 4.5) i odkryłeś, że rozwiązania obejmujące wyzwalacze stylu po prostu nie działają, oto moje rozwiązanie:
Zastąp ControlTemplate ListViewItem w stylu:
.. I DataTemplate:
Wyniki tego w czasie wykonywania (pozycja „B” jest zaznaczona, pozycja „D” jest najechana kursorem):
źródło
Użyj poniższego kodu:
źródło
Poniższy kod wyłącza wybór wiersza ListViewItem, a także pozwala na dodanie dopełnienia, marginesu itp.
źródło
Poniższy kod wyłącza Focus na ListViewItem
źródło