首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用绑定创建的菜单与使用MaterialDesignThemes包创建的菜单不同

使用绑定创建的菜单与使用MaterialDesignThemes包创建的菜单不同
EN

Stack Overflow用户
提问于 2021-08-03 08:24:26
回答 1查看 25关注 0票数 0

首先,请理解我正在使用翻译器提问。

我正在用wpf做一个申请。使用binding创建的菜单与使用MaterialDesignThemes package创建的菜单不同。

enter image description here

enter image description here

enter image description here

我需要混合使用绑定和MaterialDesignThemes。菜单创建应通过绑定进行,形状应与在MaterialDesignThemes中创建的结果相同。

附加cs和xaml源。

代码语言:javascript
复制
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 { }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-08-03 23:51:39

我解决了。

Menu.ItemContainerStyle -> Style -> BaseOn / Add

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68632652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档