You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:45:13