Liste Kutusundaki seçimi nasıl devre dışı bırakabilirim?
Liste Kutusundaki seçimi nasıl devre dışı bırakabilirim?
Yanıtlar:
ItemsControl
Bunun diğer yönlerine ihtiyacınız olmadığı sürece ListBox
kullanabilirsiniz ItemsControl
. Öğeleri yerleştirir ItemsPanel
ve seçim kavramına sahip değildir.
<ItemsControl ItemsSource="{Binding MyItems}" />
Varsayılan olarak, ItemsControl
alt öğelerinin sanallaştırılmasını desteklemez. Çok sayıda öğeniz varsa, sanallaştırma bellek kullanımını azaltabilir ve performansı artırabilir; bu durumda yaklaşım 2'yi kullanabilir ve stilinizi biçimlendirebilirListBox
veya bilgisayarınıza sanallaştırma ekleyebilirsinizItemsControl
.
ListBox
Alternatif olarak, ListBox'ı seçim görünmeyecek şekilde biçimlendirin.
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<!-- SelectedItem with focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="Transparent" />
<!-- SelectedItem without focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="Transparent" />
<!-- SelectedItem text foreground -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
Color="Black" />
</Style.Resources>
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</ListBox.Resources>
ItemsControl
, seçim konseptini tamamen kaldıracaktır.
Benim için çalışan çok basit ve basit bir çözüm buldum, umarım sizin için de işe yarar
<ListBox ItemsSource="{Items}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Focusable = "False"
!
<Setter Property="IsHitTestVisible" Value="False" />
Yerine bir ItemsControl
yerine geçebilirsiniz ListBox
. An'ın ItemsControl
seçim kavramı yoktur, bu yüzden kapatmak için hiçbir şey yoktur.
ItemTemplate
.
Dikkate değer başka bir seçenek ListBoxItems devre dışı bırakmaktır. Bu, aşağıdaki snippet'te gösterildiği gibi ItemContainerStyle ayarlanarak yapılabilir.
<ListBox ItemsSource="{Binding YourCollection}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Metnin gri olmasını istemiyorsanız, stilin kaynaklarına şu tuşla bir fırça ekleyerek devre dışı bırakılan rengi belirleyebilirsiniz: {x: Static SystemColors.GrayTextBrushKey}. Diğer çözüm, ListBoxItem denetim şablonunu geçersiz kılmak olacaktır.
Bu aynı zamanda, itemscontrol yerine liste kutusu kullanmanız gerekiyorsa, ancak sadece seçilmemesi gereken öğeleri görüntülüyorum, kullanacağım:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
Burada oldukça iyi cevaplar, ama biraz farklı bir şey arıyordum: Seçim istiyorum, ama sadece gösterilmesini (veya farklı bir konuda gösterilmesini) istemiyorum.
Yukarıdaki çözümler benim için (tamamen) işe yaramadı, bu yüzden başka bir şey yaptım: Liste kutum için şablonları tamamen yeniden tanımlayan yeni bir stil kullandım:
<Style x:Key="PlainListBoxStyle" TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<ItemsPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Bundan başlayarak, kendi seçiminizi kolayca vurgulayabilir veya hiç istemiyorsanız böyle bırakabilirsiniz.
@Drew Noakes'ın cevabı çoğu durumda hızlı bir çözüm olsa da, x: Statik fırçaların ayarlanmasıyla birlikte gelen bir miktar kusur var.
X: Statik fırçaları önerildiği gibi ayarladığınızda, liste kutusu öğesindeki tüm alt denetimler bu stili devralır.
Bu, liste kutusu öğesinin vurgulanmasını devre dışı bırakmak için çalışırken, alt denetimler için istenmeyen etkilere neden olabileceği anlamına gelir.
Örneğin, ListBoxItem içinde bir ComboBox varsa, ComboBox içinde vurgulamak için fareyi devre dışı bırakır.
Bunun yerine, VisualStates'i Seçili, Seçili Olmayan ve MouseOver olayları için bu yığın akışı iş parçacığında belirtilen çözümde kapsanan şekilde ayarlamayı düşünün: Denetim Vurgulamasını ListBoxItem'den kaldırın, ancak alt denetimler değil .
-Frinny
Yine başka bir çözüm öneriyorum. Sadece bir şablondan ListBoxItem
başka bir şey olmayacak şekilde yeniden ContentPresenter
...
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Bu yaklaşımın nedenleri şunlardır:
Benim durumumda, kullanıcı içeriğimin içeriğiyle etkileşimini devre dışı bırakmak istemiyorum, ListBoxItems
bu nedenle ayarlanacak çözüm benim IsEnabled
için işe yaramayacak.
ListBoxItem
Renkle ilgili özellikleri geçersiz kılarak yeniden stil vermeye çalışan diğer çözüm, yalnızca şablonun bu özellikleri kullandığından emin olduğunuz örneklerde çalışır. Bu, varsayılan stiller için iyidir, ancak özel stillerle kırılır.
Standarttan tamamen farklı bir görünüme sahip olduğu ve sanallaştırmayı desteklemediği için çok daha fazla ItemsControl
şey kullanan çözümler , yine de yeniden şablon yapmanız gerekiyor .ItemsControl
ListBox
ItemsPanel
Yukarıdakilerin varsayılan görünümünü değiştirmez, ListBox
için veri şablonlarındaki öğeleri devre dışı bırakmaz ListBox
, varsayılan olarak sanallaştırmayı destekler ve uygulamanızda kullanılmakta olan veya kullanılmayan stillerden bağımsız olarak çalışır. Bu KISS prensibi.
Not: Bu çözüm, klavye gezinmesi veya sağ tıklama ile seçimi devre dışı bırakmaz (örn. Ok tuşları ve ardından boşluk tuşu) ile
Önceki tüm yanıtlar ya seçme özelliğini tamamen kaldırır (çalışma zamanında geçiş yapmaz) ya da görsel efekti kaldırır, ancak seçimi kaldırmaz.
Peki ya seçimi kullanıcı koduna göre değil, koda göre seçmek ve göstermek istiyorsanız? Tüm Liste Kutusunu devre dışı bırakmazken kullanıcının seçimini "dondurmak" isteyebilirsiniz?
Çözüm, tüm ItemsContentTemplate'i görsel krom içermeyen bir Düğme içine sarmaktır. Düğmenin boyutu Öğenin boyutuna eşit olmalıdır, bu yüzden tamamen kaplıdır. Şimdi düğmenin IsEnabled-Property özelliğini kullanın:
Öğenin Seçim durumunu "dondurmak" için düğmeyi etkinleştirin. Etkinleştirilen düğme, ListboxItem-Eventhandler öğesine gelmeden önce tüm fare olaylarını yediği için çalışır. ItemsDataTemplate öğeniz, düğmeler içeriğinin bir parçası olduğu için MouseEvents almaya devam edecektir.
Öğesini tıklayarak seçimi değiştirmeyi etkinleştirmek için düğmeyi devre dışı bırakın.
<Style x:Key="LedCT" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Button IsEnabled="{Binding IsSelectable, Converter={StaticResource BoolOppositeConverter}}" Template="{DynamicResource InvisibleButton}">
<ContentPresenter />
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="InvisibleButton" TargetType="{x:Type Button}">
<ContentPresenter/>
</ControlTemplate>
dartrax
Belki de sadece ItemsControl işlevselliğine ihtiyacınız var? Seçime izin vermiyor:
<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />
Örneğin, Windows Phone'da çalışan basit bir düzeltme, seçilen öğeyi null olarak ayarlamakla ilgilidir:
<ListBox SelectionChanged="ListBox_SelectionChanged">
Ve arkasındaki kodda:
private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
(sender as ListBox).SelectedItem = null;
}
Mükemmel bir yol buldum.
ListBox IsHitTestVisible öğesini false olarak ayarlayın, böylece kullanıcı fareyle üzerine gelemez veya sayfayı aşağı veya yukarı kaydıramaz.
PreviewGotKeyboardFocus e.Handled = true öğesini yakalayın, böylece kullanıcı klavye Sekmesi, Yukarı ok, Aşağı ok tuşlarıyla öğeyi seçebilir.
Bu şekilde avantaj:
Xmal
<ListBox Name="StudentsListBox" ItemsSource="{Binding Students}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" IsHitTestVisible="False" PreviewGotKeyboardFocus="StudentsListBox_PreviewGotKeyboardFocus">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="Bd">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="Yellow" />
<Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Name="GradeBlock" Text="{Binding Grade}" FontSize="12" Margin="0,0,5,0"/>
<TextBlock Grid.Column="1" Name="NameTextBlock" Text="{Binding Name}" FontSize="12" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
kod
private void StudentsListBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
e.Handled = true;
}
Benim için en iyi çözüm:
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="True"/>
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
IsEnabled = yanlış
Liste kutunuzda / açılır listenizdeki bir veya daha fazla seçeneği devre dışı bırakmak için "devre dışı" özelliğini aşağıda gösterildiği gibi ekleyebilirsiniz. Bu, kullanıcının bu seçeneği seçmesini önler ve gri bir kaplama alır.
ListItem item = new ListItem(yourvalue, yourkey);
item.Attributes.Add("disabled","disabled");
lb1.Items.Add(item);