如何在WPF中创建具有Microsoft Web应用程序样式的菜单

我们的任务是在WPF中设计一个企业应用程序,它将取代具有现代外观的战舰灰色Winforms应用程序。

我们喜欢Microsoft Web应用程序目前拥有的外观和感觉:

在此处输入图像描述

我们可以通常的方式在WPF中创建这些菜单:

            

但是我们会得到一些看起来像Winforms菜单的东西。

我已经看到了一些像这样的令人印象深刻的造型努力,但它们似乎都具有相同熟悉的Winforms形状。 我也看过像MahApps Metro这样的图书馆的菜单,但这些菜单让我们觉得太简单了。

WPF菜单控件是否足够灵活,可以如上图所示进行样式设置,还是应该从堆栈面板和列表构建自定义菜单控件等其他路径? 有什么权衡?

奖励积分(即赏金)将被授予xaml / code,正是这样。

这个菜单样式的一个例子:
https://www.visualstudio.com/

WPF的设计真的可以改变每个开箱即用的机制/控件(按钮,菜单,树视图等)的外观和行为。 所以,一般来说,最好这样做而不是重写一切。 例如,如果您重新设计自定义菜单,则必须考虑键盘,UI自动化等…

所以,我给你的例子做了一个镜头并尝试构建一个最小的工作样本 – 纯XAML – 模仿VS在线菜单(我还添加了悬浮背景颜色变化,默认情况下不在WPF的菜单中)。

结果如下,如您所见,它看起来非常相似:

在此处输入图像描述

这是XAML。 我选择为每个MenuItem使用自定义控件模板。 我认为当你需要真正定制每件商品时它非常实用。

                                                                                            

该项目可在github上找到 。

您可能正在寻找一些Wpf主题。

比如http://brianlagunas.com/free-metro-light-and-dark-themes-for-wpf-and-silverlight-microsoft-controls/或者看看那个SO答案: 任何免费的WPF主题?

然后你可能想要用你想要的外观和感觉来定制它。

你可以使用类似的东西: http : //materialdesigninxaml.net

这是默认菜单,但是白色,您可以通过编辑此样式来更改背景颜色,文本字体,高度以及您想要的所有其他内容。

在这里你的MainWindow.xaml

                     

app.xaml文件中的样式

                                                                                                                                                                                                                      

我会用XAML创建菜单

页面的XAML是这样的:

                  

在代码中:

  private void OnMouseLeftButtonDown(object sender, MouseEventArgs e) { var textBlock = sender as TextBlock; if (textBlock == null) return; var relativePoint = VisualTreeHelper.GetOffset(textBlock);//textBlock.TransformToAncestor(Content).Transform(new Point(0, 0)); //Almost invisible Background - If the user clicks it the menu is hidden var back = new Border{Background = new SolidColorBrush(Color.FromArgb(1,255,255,255))}; back.MouseLeftButtonDown += (o, args) => { Content.Children.Remove(back.Tag as UIElement); Content.Children.Remove(back); }; Content.Children.Add(back); //Build menu var menu = new Border{Background = new SolidColorBrush(Colors.White), Width = 200, Height = 500, BorderBrush = new SolidColorBrush(Colors.Gray), BorderThickness = new Thickness(1), HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top}; back.Tag = menu; menu.RenderTransform = new TranslateTransform(relativePoint.X, relativePoint.Y + textBlock.ActualHeight + 5); //Do some more styling //Fill Menu here according to the tag of the TextBlock (switch(textBlock.Tag){...} or use a predefined view Content.Children.Add(menu); //Hide the Menu on click - TODO Implement logic to hide menu if a MenuItem was clicked... menu.MouseLeftButtonDown += (o, args) => { Content.Children.Remove(back.Tag as UIElement); Content.Children.Remove(back); }; } 

好的,这是一个非常基本的例子,需要很多改进,但我认为你可以继续…