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

MaterialDesignInXaml主题色切换异常:MenuItem点击Swatch参数为空

问题分析与解决方案

你遇到的空引用异常核心原因很明确:你的ApplyAccentCommand没有收到当前点击的Swatch实例作为参数,导致命令执行时o为null,转换Swatch类型时抛出异常。

为什么参数为空?

你的MenuItem通过ItemsSource绑定到Swatches集合,每个MenuItem的DataContext其实就是集合里对应的单个Swatch对象,但你的Style里只设置了Command,没有指定CommandParameter,所以命令触发时没有传递任何参数,自然就会得到null。

修复步骤

只需要在你的AccentColorMenuItemStyle里添加一个CommandParameter的Setter,绑定到当前MenuItem的DataContext(也就是对应的Swatch)即可:

<Style x:Key="AccentColorMenuItemStyle" BasedOn="{StaticResource MetroMenuItem}" TargetType="{x:Type MenuItem}">
    <Setter Property="Command" Value="{Binding DataContext.ApplyAccentCommand, RelativeSource={RelativeSource AncestorType=Window}}" />
    <!-- 新增这行,传递当前Swatch作为命令参数 -->
    <Setter Property="CommandParameter" Value="{Binding}" />
    <Setter Property="Header" Value="{Binding Name, Mode=OneWay}" />
    <Setter Property="Icon" Value="{StaticResource AccentMenuIcon}" />
</Style>

额外的健壮性优化

为了避免后续类似的意外,建议在ApplyAccent方法里添加空值检查,即使参数为空也不会崩溃:

private static void ApplyAccent(Swatch swatch) {
    if (swatch == null) return; // 空值保护
    new PaletteHelper().ReplaceAccentColor(swatch);
}

这样修改后,点击菜单时就能正确传递对应的Swatch实例,命令执行也就不会再抛出空引用异常了。

内容的提问来源于stack exchange,提问作者Steven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:10