我试图将MaterialDesign重音添加到MenuItem,实际上我已经管理了这个 部分地,这是我到目前为止所做的:
创建菜单:
<Menu Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Stretch">
<MenuItem Header="Stile" Width="100"
ItemContainerStyle="{StaticResource AccentColorMenuItemStyle}"
ItemsSource="{Binding SettingsController.Swatches, Mode=OneWay}" />
</Menu>
容器定义:
<Ellipse x:Key="AccentMenuIcon"
Width="16"
Height="16"
x:Shared="False"
Fill="{Binding AccentExemplarHue.Color, Converter={StaticResource ColorToBrushConverter}, Mode=OneWay}" />
<Style x:Key="AccentColorMenuItemStyle"
BasedOn="{StaticResource MetroMenuItem}" TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding DataContext.ApplyAccentCommand,
RelativeSource={RelativeSource AncestorType=Window}}" />
<Setter Property="Header" Value="{Binding Name, Mode=OneWay}" />
<Setter Property="Icon" Value="{StaticResource AccentMenuIcon}" />
</Style>
我定义了一个颜色转换器显示为椭圆颜色:
public class ColorToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return new SolidColorBrush((Color)value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush c = (SolidColorBrush)value;
System.Drawing.Color col = System.Drawing.Color.FromArgb(c.Color.A, c.Color.R, c.Color.G, c.Color.B);
return col;
}
}
然后在我的viewmodel中我以这种方式实现:
private static void ApplyBase(bool isDark)
{
new PaletteHelper().SetLightDark(isDark);
}
public IEnumerable<Swatch> Swatches { get; }
public ICommand ApplyPrimaryCommand { get; } = new SimpleCommand(o => ApplyPrimary((Swatch)o));
private static void ApplyPrimary(Swatch swatch)
{
new PaletteHelper().ReplacePrimaryColor(swatch);
}
public ICommand ApplyAccentCommand { get; } = new SimpleCommand(o => ApplyAccent((Swatch)o));
private static void ApplyAccent(Swatch swatch)
{
new PaletteHelper().ReplaceAccentColor(swatch);
}
使用上面的代码我得到menuItem中显示的所有重音,但是我有一个问题,
我点击menuItem颜色,然后点击Command&#34; ApplyAccentCommand&#34;叫做我得到一个空例外 这里:
private static void ApplyAccent(Swatch swatch)
{
new PaletteHelper().ReplaceAccentColor(swatch);
}
特别是在swatch对象(这是重音)我做错了什么?感谢。
答案 0 :(得分:0)
我怀疑你实际上是在获取ArgumentNullException。自ReplaceAccentColor checks the incoming parameter for null以来。如果在该行上设置断点,我怀疑swatch为null。
我看到你正在设置命令,但是没有设置命令的参数意味着将使用默认值null。
只需在菜单项样式中再添加一个setter就可以修复它。
<Setter Property="CommandParameter" Value="{Binding}" />