WPF:如何为 GridView 设置 ContentMenu 而不破坏 Fluent 样式?

mLazy 0 信誉分
2025-09-20T01:13:02.2333333+00:00

我正在使用 .NET-10.0.100-rc.1.25451.107 预览版。我的 OS 是 Windows10 22H2。

我注意到 .NET 10 预览版中加入了 GridView。我使用如下代码来创建一个带 GridView 的 ListView:

<ListView ItemsSource="{Binding DisplayItems}" FontSize="13" Background="{StaticResource BgLight}" Margin="0 10 0 10"
          SelectionChanged="ListView_SelectionChanged" x:Name="ListView">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="名称" Width="150">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock TextTrimming="CharacterEllipsis" Text="{Binding ItemName}" ToolTip="{Binding ItemName}" 
                            ToolTipService.InitialShowDelay="300"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            <GridViewColumn Header="状态" Width="150">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock TextTrimming="CharacterEllipsis" Text="{Binding State}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

此代码可以正常运行,绑定也运行良好。现在我尝试在 <ListView> 中插入以下代码,以为 GridView 的每一行添加一个 ContentMenu:

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="ContextMenu" Value="{StaticResource ContextMenu}"/>
    </Style>
</ListView.ItemContainerStyle>

我的 ContentMenu 定义如下:

<Window.Resources>
    <ContextMenu x:Key="ContextMenu">
        <MenuItem x:Name="MenuRemove" Click="MenuRemove_Click">
            <MenuItem.Header>
                <StackPanel Orientation="Horizontal">
                    <TextBlock FontFamily="{StaticResource SymbolThemeFontFamily}" 
                               Text="&#xE711;" VerticalAlignment="Center" Margin="0 0 10 0"/>
                    <TextBlock Text="移除"/>
                </StackPanel>
            </MenuItem.Header>
        </MenuItem>
    </ContextMenu>
</Window.Resources>

我发现当我设置了 ItemContainerStyle 后,GridView 失去了原有的 Fluent 样式。

我尝试过把 <Style> 一行改为:

<Style TargetType="ListViewItem" BasedOn="{StaticResource {x:Type ListViewItem}}">

应用了这段代码之后,我的 ListView 恢复了 Fluent 样式,但是列表中的数据绑定似乎损坏了。现在表中每行只能显示 MyApp.ViewModel.DisplayItem,这是我用于绑定 ListView 的 ViewModel 类名。而且这个只显示一列。我有点怀疑是不是破坏了 GridView。

请问我的操作何处出现了错误?有设置 ContentMenu 而不破坏 Fluent 样式的方法吗?

开发人员技术 | .NET | 其他
0 个注释 无注释
{count} 票

你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。