У меня есть список в WPF, и когда они выбирают элемент, он показывает уродливые цвета Могу ли я сделать все предметы неизменными?
Сделать элементы списка в WPF недоступными
Ответ 1
Если вам не нужен выбор, используйте ItemsControl
, а не ListBox
Ответ 2
Добавить свойство Focusable как false в стиле ListBoxItem:
<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
<!-- Possibly other setters -->
<Setter Property="Focusable" Value="False" />
</Style>
Ответ 3
Если вы не хотите, чтобы они были выбраны, вы, вероятно, не хотите просматривать список. Но если это то, что вам действительно нужно, вы можете сделать это со стилем:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border
Name="Border"
Padding="2"
SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background" Value="#DDDDDD"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<Grid>
<ListBox>
<ListBoxItem>One</ListBoxItem>
<ListBoxItem>Two</ListBoxItem>
<ListBoxItem>Three</ListBoxItem>
</ListBox>
</Grid>
</Page>
Посмотрите на выбранный триггер. Вы можете сделать границу другим цветом, чтобы она не была "Ugly" или была прозрачной, и она не будет видна при выборе.
Надеюсь, что это поможет.
Ответ 4
Пожалуйста, используйте это в своем списке. Я нашел это очень элегантное решение
<ListBox ItemsSource="{Binding YourCollection}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Ответ 5
Там еще проще: установите ListBox
свойство IsHitTestVisible="False"
. Это предотвращает получение всеми элементами в списке событий мыши. Преимущество этой функции заключается в том, что вы останавливаете выделение, как вы наведите курсор мыши.
Это работает для меня в WP 7.1.
Ответ 6
Простой способ сделать это (используя ответ от viky выше) - установить выбранный индекс в -1 в SelectionChanged(), как показано ниже.
public void OnListView_SelectionChanged(Object sender, RoutedEventArgs e)
{
if (null != sender && sender is ListView)
{
ListView lv = sender as ListView;
lv.SelectedIndex = -1;
}
}
Ответ 7
Лучше избегать событий, более элегантный и без побочных эффектов тег стиля.
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
... what you want as a source ...
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Ответ 8
вы можете обработать событие SelectionChanged в ListBox и снять выделение выбранного элемента в обработчике событий.
Ответ 9
В случае, если кто-то все еще хочет использовать функцию SelectBoxItem ListBoxItem (или ListViewItem). http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/
Ответ 10
Вы также можете отключить Listbox, который даст вам статический, неинтерактивный список.
<ListBox IsEnabled="False"/>
Я думаю, что это решение максимально просто.
Ответ 11
В моем случае у меня были шаблоны ListboxItems с Textblock и ComboBox. Единственным "активным" должен быть Combo...
<ScrollViewer VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
CanContentScroll="True" />
<ItemsControl>
....here my content....
</Itemscontrol>
</ScrollViewer>
действительно работал у меня, как и ожидалось. BR, Daniel