首先,请理解我正在使用翻译器提问。
我正在用wpf做一个申请。使用binding创建的菜单与使用MaterialDesignThemes package创建的菜单不同。
我需要混合使用绑定和MaterialDesignThemes。菜单创建应通过绑定进行,形状应与在MaterialDesignThemes中创建的结果相同。
附加cs和xaml源。
xaml
<Window x:Class="EvoLogger.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Logger"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
WindowStyle="None"
AllowsTransparency="True"
BorderThickness="1"
ResizeMode ="CanResizeWithGrip"
MouseLeftButtonDown="Window_MouseLeftButtonDown"
Title="MainWindow" Height="800" Width="800">
<Grid Margin="0,5,0,5">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Menu Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemsSource="{Binding MenuItems}">
<Menu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding Command}" />
</Style>
</Menu.ItemContainerStyle>
<Menu.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
<TextBlock Text="{Binding Header}"/>
</HierarchicalDataTemplate>
</Menu.ItemTemplate>
</Menu>
<Menu x:Name="mainMenu" IsMainMenu="True" Grid.Row="2">
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Stretch" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<MenuItem Header="_File" Height="40">
<MenuItem
Header="Save"
Icon="{materialDesign:PackIcon Kind=ContentSave}">
</MenuItem>
<MenuItem Header="Save As.."/>
<MenuItem
Header="Exit"
InputGestureText="Ctrl+E"
Icon="{materialDesign:PackIcon Kind=ExitToApp}"/>
<Separator/>
<MenuItem
Header="Excellent"
IsCheckable="True"
IsChecked="True"/>
<MenuItem
Header="Rubbish"
IsCheckable="True"/>
<MenuItem
Header="Dig Deeper"
InputGestureText="Ctrl+D">
<MenuItem
Header="Enlightenment?"
IsCheckable="True"/>
<MenuItem
Header="Disappointment"
IsCheckable="True"/>
</MenuItem>
<MenuItem
Header="Look Deeper"
InputGestureText="Ctrl+D">
<MenuItem Header="Plain"/>
<MenuItem Header="Ice Cream"/>
</MenuItem>
</MenuItem>
<MenuItem Header="_Edit" Height="40">
<MenuItem
Header="_Cut"
Command="Cut"
Icon="{materialDesign:PackIcon Kind=ContentCut}"/>
<MenuItem
Header="_Copy"
Command="Copy"
Icon="{materialDesign:PackIcon Kind=ContentCopy}"/>
<MenuItem
Header="_Paste"
Command="Paste"
Icon="{materialDesign:PackIcon Kind=Cog}"/>
</MenuItem>
</Menu>
</Grid>
</Window>
cs
using System;
using System.Windows;
using EvoConfiguration;
using System.IO;
using System.Windows.Input;
using System.Collections.ObjectModel;
namespace Logger
{
public partial class MainWindow : Window
{
public ObservableCollection<MenuItemViewModel> MenuItems { get; set; }
public MainWindow()
{
InitializeComponent();
MenuItems = new ObservableCollection<MenuItemViewModel>
{
new MenuItemViewModel { Header = "Alpha" },
new MenuItemViewModel { Header = "Beta",
MenuItems = new ObservableCollection<MenuItemViewModel>
{
new MenuItemViewModel { Header = "Beta1" },
new MenuItemViewModel { Header = "Beta2",
MenuItems = new ObservableCollection<MenuItemViewModel>
{
new MenuItemViewModel { Header = "Beta1a" },
new MenuItemViewModel { Header = "Beta1b" },
new MenuItemViewModel { Header = "Beta1c" }
}
},
new MenuItemViewModel { Header = "Beta3" }
}
},
new MenuItemViewModel { Header = "Gamma" }
};
DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Window2 w2 = new Window2();
w2.Show();
}
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DragMove();
}
}
public class MenuItemViewModel
{
private readonly ICommand _command;
public MenuItemViewModel()
{
_command = new CommandViewModel(Execute);
}
public string Header { get; set; }
public ObservableCollection<MenuItemViewModel> MenuItems { get; set; }
public ICommand Command
{
get
{
return _command;
}
}
private void Execute()
{
// (NOTE: In a view model, you normally should not use MessageBox.Show()).
MessageBox.Show("Clicked at " + Header);
}
}
public class CommandViewModel : ICommand
{
private readonly Action _action;
public CommandViewModel(Action action)
{
_action = action;
}
public void Execute(object o)
{
_action();
}
public bool CanExecute(object o)
{
return true;
}
public event EventHandler CanExecuteChanged
{
add { }
remove { }
}
}
}发布于 2021-08-03 23:51:39
我解决了。
Menu.ItemContainerStyle -> Style -> BaseOn / Add
<Menu Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemsSource="{Binding MenuItems}">
<Menu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Command" Value="{Binding Command}"/>
</Style>
</Menu.ItemContainerStyle>
<Menu.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
<TextBlock Text="{Binding Header}"/>
</HierarchicalDataTemplate>
</Menu.ItemTemplate>
</Menu>
<Menu Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemsSource="{Binding MenuItems}">
<Menu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}" **BasedOn="{StaticResource MaterialDesignMenuItem}"**>
<Setter Property="Command" Value="{Binding Command}"/>
</Style>
</Menu.ItemContainerStyle>
<Menu.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
<TextBlock Text="{Binding Header}"/>
</HierarchicalDataTemplate>
</Menu.ItemTemplate>
</Menu>https://stackoverflow.com/questions/68632652
复制相似问题