WinUI3 ListView如何禁用用户选择且保留子控件交互?
问题:WinUI3 ListView 阻止用户选择但保留子控件交互
我在WinUI3应用中有一个ListView控件,用于展示应用其他区域的“当前”项,通过绑定ListView的SelectedItem属性保证视觉一致性。现在需要阻止用户通过点击等方式选择ListView中的其他项,但要保留子控件的交互能力(比如嵌套的子ListView的水平滚动)。
已尝试的无效方案
- 在ListView上设置
IsItemClickEnabled="False",无明显效果 - 在ListView上设置
SelectionMode="None",会禁用当前选中项的视觉显示 - 在ListView前方放置透明控件,会阻止ListView自身的滚动
- 修改ListViewItem的视觉状态(参考visc的方案),会禁用当前选中项的显示
- 在项容器上设置
IsHitTestVisible = false,会阻断子控件的所有交互(比如子ListView无法滚动)
补充说明
核心难点是阻止用户选择的同时不阻断所有交互,我的ListView中嵌套了其他ListView,必须保留用户水平滚动子ListView项的能力,示例代码如下:
XAML 代码
<Grid RowDefinitions="Auto,*"> <TextBox x:Name="SelectedItemTextBox" Grid.Row="0" /> <ListView Grid.Row="1" ItemsSource="{x:Bind Items, Mode=OneWay}" SelectedIndex="2"> <ListView.ItemTemplate> <DataTemplate x:DataType="local:MyItem"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Margin="0,8,0,0" Text="{x:Bind Name, Mode=OneWay}" /> <ListView Grid.Row="1" Margin="4,0,0,4" ItemsSource="{x:Bind SubItems}" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollMode="Enabled" ScrollViewer.VerticalScrollMode="Disabled" SelectedIndex="2"> <ListView.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </ListView.ItemsPanel> <ListView.ItemTemplate> <DataTemplate x:DataType="x:String"> <TextBlock Text="{x:Bind}" /> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid>
C# 代码
public sealed partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // Initially set the target outside the dialog RootCanvas.Children.Add(TeachingTip); TeachingTip.Target = DialogButton; TeachingTip.IsOpen = true; for (int i = 0; i < 10; i++) { MyItem item = new() { Name = i.ToString() }; for (int j = 0; j < 5; j++) { item.SubItems.Add($"Sub item {j + 1}"); } Items.Add(item); } } public ObservableCollection<MyItem> Items { get; } = new(); } public class MyItem { public List<string> SubItems { get; } = new(); public string Name { get; set; } }
内容的提问来源于stack exchange,提问作者Siyh
相关产品推荐
相关产品推荐

