gpt4 book ai didi

c# - 列表框选择模式在 WPF 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:44 24 4
gpt4 key购买 nike

我有一个包含一些项目的 ListBox。我想实现:

1) CTRL键选择不同的项目。

2) Tab 键改变项目。

3) Shift + tab 控件..

  • 我正在使用 SelectionMode=Extended,但是 CTRL 不起作用,为什么?

  • 当我按下 Tab 键时,它只在第一个项目上切换,为什么?

Xaml:

 <Window.Resources>
<Style x:Key="ButtonStyle2" TargetType="{x:Type CheckBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<Canvas>
<Path x:Name="path" Data="{Binding PathCoords}" Margin="{Binding Margin}" Fill="#FFF4F4F5" Stretch="Fill" Stroke="Black"/>
</Canvas>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Stroke" TargetName="path" Value="#FFCF2222"/>
<Setter Property="StrokeThickness" TargetName="path" Value="2"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True"/>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Items}" SelectionMode="Extended">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas></Canvas>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Style="{DynamicResource ButtonStyle2}" Focusable="True"></CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>

代码:

namespace WpfApplication13
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
DataContext = new Data();
InitializeComponent();
}
}
public class Element
{
public string PathCoords { get; set; }
public string Margin { get; set; }
public int id { get; set; }
}
public class Data
{
public List<Element> Items { get; set; }
public Data()
{
Items = new List<Element>();
Items.Add(new Element { PathCoords = "M52,92L89.5,57.5 99.5,100.5z" });
Items.Add(new Element { PathCoords = "M131,104L150.5,39.5 204.5,87.5 155.5,88.5z" ,Margin="131,39.5,0,0"});
Items.Add(new Element { PathCoords = "M232,105L231.5,49.5 294.5,49.5 291.5,97.5z", Margin = "231.5,49.5,0,0" });
Items.Add(new Element { PathCoords = "M75,183L85.5,154.5 107.5,185.5z", Margin = "75,154.5,0,0" });
Items.Add(new Element { PathCoords = "M167,222L166.5,169.5 230.5,190.5z", Margin = "166.5,169.5,0,0" });
Items.Add(new Element { PathCoords = "M258,199L273.5,146.5 332.5,161.5 327.5,207.5z", Margin = "258,146.5,0,0" });
}
}
}

最佳答案

要使 SelectionMode=Extended 正常工作,您的 ListBox 中必须有一个 Trigger 来通知 CheckBox 已选择新的 ListBoxItem

目前您可以选择多个项目,但是只有其中一个项目中的 CheckBox 会获得焦点,因此只有一个 Path 的颜色会改变。

因此,如果您将 CheckBox 的触发器中的条件设置为 IsChecked 而不是 IsFocused,如下所示:

<Style x:Key="ButtonStyle2" TargetType="{x:Type CheckBox}">
...
<Trigger Property="IsChecked" Value="True">
<Setter Property="Stroke" TargetName="path" Value="#FFCF2222"/>
<Setter Property="StrokeThickness" TargetName="path" Value="2"/>
</Trigger>
...
</Style>

然后为您的 ListBox.ItemTemplate 添加适当的 DataTrigger,如下所示:

</ListBox>
...
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Name="chb" Style="{DynamicResource ButtonStyle2}" Focusable="True"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource= {RelativeSource Mode=FindAncestor, AncestorType=
{x:Type ListBoxItem}},Path=IsSelected}" Value="True">
<Setter Property="IsChecked" TargetName="chb" Value="True"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

那么多选就可以了。

关于c# - 列表框选择模式在 WPF 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com