pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

如何在 WPF 中創建具有 Microsoft Web 應用程序樣式的

How to create a menu in WPF that has Microsoft Web Application styling(如何在 WPF 中創建具有 Microsoft Web 應用程序樣式的菜單)
本文介紹了如何在 WPF 中創建具有 Microsoft Web 應用程序樣式的菜單的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我們的任務是在 WPF 中設計一個企業應用程序,該應用程序將取代戰艦灰色 Winforms 應用程序,使其具有現代感.

我們喜歡 Microsoft Web 應用程序當前擁有的外觀和感覺:

我們可以用通常的方式在 WPF 中創建這些菜單:

<Menu DockPanel.Dock="Top"><MenuItem Header="_File"><MenuItem Header="_New"/><MenuItem Header="_Open"/><MenuItem Header="_Save"/><分隔符/><MenuItem Header="_Exit"/></菜單項></菜單><TextBox AcceptsReturn="True"/></DockPanel>

但我們會得到一些看起來像 Winforms 菜單的東西.

我見過一些相當令人印象深刻的樣式設計,例如

這是 XAML.我選擇為每個 MenuItem 使用自定義控件模板.我認為當您需要真正自定義每個項目時,它非常實用.

<窗口.資源><BooleanToVisibilityConverter x:Key="btv"/><!-- 設置頂級菜單項的樣式--><ControlTemplate x:Key="VsMenuTop" TargetType="MenuItem"><StackPanel TextBlock.FontSize="15px" Height="40"><!-- 標簽、圖標等--><Label Content="{TemplateBinding Header}" Margin="5" Foreground="White"/><!-- 子項目--><Popup IsOpen="{TemplateBinding IsSubmenuOpen}" AllowsTransparency="True" Focusable="False"><Border BorderThickness="1" Background="White" BorderBrush="#E0E0E0"><StackPanel IsItemsHost="True"/></邊框></彈出窗口><StackPanel.Style><Style TargetType="StackPanel"><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#106EBE"/></觸發器></Style.Triggers></風格></StackPanel.Style></StackPanel></控制模板><!-- 設置非頂級菜單項的樣式--><ControlTemplate x:Key="VsMenuSub" TargetType="MenuItem"><DockPanel TextBlock.FontSize="15px" x:Name="panel"><!-- 標簽、圖標等--><Image Source="{Binding Icon, RelativeSource={RelativeSource TemplatedParent}}" Width="20" Margin="5,0"/><Label Content="{TemplateBinding Header}" Foreground="Black" Margin="0,5,5,5"/><!-- 僅當此菜單項有子項時才繪制向右箭頭 --><Image Source="icon_right.png" Visibility="{Binding HasItems, Converter={StaticResource btv}, RelativeSource={RelativeSource TemplatedParent}}"/><!-- 子項目--><Popup IsOpen="{TemplateBinding IsSubmenuOpen}" AllowsTransparency="True" Focusable="False" Placement="Right" ><Border BorderThickness="1" Background="White" BorderBrush="#E0E0E0"><StackPanel IsItemsHost="True"/></邊框></彈出窗口></DockPanel><ControlTemplate.Triggers><Trigger Property="IsHighlighted" Value="True"><Setter Property="Background" TargetName="panel" Value="#EFF6FC"/></觸發器></ControlTemplate.Triggers></控制模板><!-- 設置分隔符的樣式--><ControlTemplate x:Key="VsMenuSep" TargetType="分隔符"><邊框高度="1" 背景="#E0E0E0"/></控制模板><!-- 設置 VSOnline 的樣式--><ControlTemplate x:Key="VsOnline" TargetType="MenuItem"><StackPanel TextBlock.FontSize="15px" Height="40" Orientation="Horizo??ntal" Background="#005A9E"><Label Content="{TemplateBinding Header}" Margin="5" Foreground="White"/><Image Source="icon_down.png" Height="20" Margin="0,0,5,0"/><!-- 子項目--><Popup IsOpen="{TemplateBinding IsSubmenuOpen}" AllowsTransparency="True" Focusable="False"><Border BorderThickness="1" Background="White" BorderBrush="#E0E0E0"><StackPanel IsItemsHost="True"/></邊框></彈出窗口></StackPanel></控制模板><!-- 一些基本的東西--><Style TargetType="菜單"><Setter Property="Background" Value="#0078D7"/><Setter Property="Height" Value="40px"/></風格></Window.Resources><!-- 真正的應用程序和真正的菜單--><堆棧面板><Menu IsMainMenu="True"><MenuItem Header="_VSOnline" Template="{StaticResource VsOnline}" ><MenuItem Header="_Whatever" Template="{StaticResource VsMenuSub}"/></菜單項><MenuItem Header="_Dashboards" Template="{StaticResource VsMenuTop}"><MenuItem Header="_Overview" Template="{StaticResource VsMenuSub}"/></菜單項><MenuItem Header="_Code" Template="{StaticResource VsMenuTop}"><MenuItem Header="_Files" Template="{StaticResource VsMenuSub}"/><MenuItem Header="_Commits" Template="{StaticResource VsMenuSub}"/><MenuItem Header="_Pushes" Template="{StaticResource VsMenuSub}"/></菜單項><MenuItem Header="_Work" Template="{StaticResource VsMenuTop}"><MenuItem Header="_Backlogs" Template="{StaticResource VsMenuSub}" Icon="icon_backlogs.png"/><MenuItem Header="_Queries" Template="{StaticResource VsMenuSub}" Icon="icon_queries.png"/><Separator Template="{StaticResource VsMenuSep}"/><MenuItem Header="_New Work Item" Template="{StaticResource VsMenuSub}"><MenuItem Header="_Epic" Template="{StaticResource VsMenuSub}" Icon="icon_epic.png"/><MenuItem Header="_Feature" Template="{StaticResource VsMenuSub}" Icon="icon_feature.png"/><MenuItem Header="_Issue" Template="{StaticResource VsMenuSub}" Icon="icon_issue.png"/><MenuItem Header="_Task" Template="{StaticResource VsMenuSub}" Icon="icon_task.png"/><MenuItem Header="_Test Case" Template="{StaticResource VsMenuSub}" Icon="icon_testcase.png"/><MenuItem Header="_User Story" Template="{StaticResource VsMenuSub}" Icon="icon_userstory.png"/></菜單項><MenuItem Header="_Bug" Template="{StaticResource VsMenuSub}" Icon="icon_bug.png"/></菜單項></菜單></StackPanel></窗口>

該項目可在 此處在 github 上獲得.

We have been tasked with designing an enterprise application in WPF that will replace a battleship grey Winforms application with a modern look and feel.

We like the look and feel that Microsoft web applications currently possess:

We could create these menus in WPF in the usual way:

<DockPanel>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="_File">
            <MenuItem Header="_New" />
            <MenuItem Header="_Open" />
            <MenuItem Header="_Save" />
            <Separator />
            <MenuItem Header="_Exit" />
        </MenuItem>
    </Menu>
    <TextBox AcceptsReturn="True" />
</DockPanel>

But we'd get something that looks like a Winforms menu.

I've seen some rather impressive styling efforts like this one, but they all seem to have the same familiar Winforms shape. I've also seen menus in libraries like MahApps Metro, but these strike us as too spartan.

Is the WPF Menu control flexible enough to be styled as shown in the picture above, or should we go another route like building a custom menu control from Stack Panels and Lists? What are the tradeoffs?

Bonus points (i.e. a bounty) will be awarded for xaml/code that does exactly this.

An example of this menu style in action:
https://www.visualstudio.com/

解決方案

WPF was really designed with the possibility to change the look and behavior of every out-of-the-box mechanisms / controls (buttons, menus, treeview, etc.). So, in general, it's better to do this rather than to rewrite everything. For example, if you redesign your custom menu, you'll have to think about keyboard, UI automation, etc...

So, I gave a shot at your example and tried to build a minimum working sample - pure XAML - that mimics VS online menu (I've also added the hover background color change that's not by default in WPF's menu).

Here is the result and, as you see, it looks very similar:

Here is the XAML. I've chosen to use a custom control template per each MenuItem. I think it's quite practical when you need to really customize every item.

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="550" Width="525">
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="btv" />

        <!-- style a top level menu item -->
        <ControlTemplate x:Key="VsMenuTop" TargetType="MenuItem">
            <StackPanel TextBlock.FontSize="15px" Height="40">
                <!-- label, icons, etc. -->
                <Label Content="{TemplateBinding Header}" Margin="5" Foreground="White" />

                <!-- sub items -->
                <Popup IsOpen="{TemplateBinding IsSubmenuOpen}" AllowsTransparency="True" Focusable="False">
                    <Border BorderThickness="1" Background="White" BorderBrush="#E0E0E0">
                        <StackPanel IsItemsHost="True" />
                    </Border>
                </Popup>
                <StackPanel.Style>
                    <Style TargetType="StackPanel">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver"  Value="True">
                                <Setter Property="Background" Value="#106EBE" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </StackPanel.Style>
            </StackPanel>
        </ControlTemplate>

        <!-- style a non-top level menu item -->
        <ControlTemplate x:Key="VsMenuSub" TargetType="MenuItem">
            <DockPanel TextBlock.FontSize="15px" x:Name="panel">
                <!-- label, icons, etc. -->
                <Image Source="{Binding Icon, RelativeSource={RelativeSource TemplatedParent}}" Width="20" Margin="5,0" />
                <Label Content="{TemplateBinding Header}" Foreground="Black" Margin="0,5,5,5" />

                <!-- draw the right arrow only if this menu item has sub items -->
                <Image Source="icon_right.png" Visibility="{Binding HasItems, Converter={StaticResource btv}, RelativeSource={RelativeSource TemplatedParent}}" />

                <!-- sub items -->
                <Popup IsOpen="{TemplateBinding IsSubmenuOpen}" AllowsTransparency="True" Focusable="False" Placement="Right" >
                    <Border BorderThickness="1" Background="White" BorderBrush="#E0E0E0">
                        <StackPanel IsItemsHost="True" />
                    </Border>
                </Popup>
            </DockPanel>
            <ControlTemplate.Triggers>
                <Trigger Property="IsHighlighted" Value="True">
                    <Setter Property="Background" TargetName="panel" Value="#EFF6FC" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

        <!-- style the separator -->
        <ControlTemplate x:Key="VsMenuSep" TargetType="Separator">
            <Border Height="1" Background="#E0E0E0" />
        </ControlTemplate>

        <!-- style the VSOnline -->
        <ControlTemplate x:Key="VsOnline" TargetType="MenuItem">
            <StackPanel TextBlock.FontSize="15px" Height="40" Orientation="Horizontal" Background="#005A9E">
                <Label Content="{TemplateBinding Header}" Margin="5" Foreground="White" />
                <Image Source="icon_down.png" Height="20" Margin="0,0,5,0" />

                <!-- sub items -->
                <Popup IsOpen="{TemplateBinding IsSubmenuOpen}" AllowsTransparency="True" Focusable="False">
                    <Border BorderThickness="1" Background="White" BorderBrush="#E0E0E0">
                        <StackPanel IsItemsHost="True" />
                    </Border>
                </Popup>
            </StackPanel>
        </ControlTemplate>

        <!-- some base stuff -->
        <Style TargetType="Menu">
            <Setter Property="Background" Value="#0078D7" />
            <Setter Property="Height" Value="40px" />
        </Style>

    </Window.Resources>

    <!-- the real app and real menu -->
    <StackPanel>
        <Menu IsMainMenu="True">
            <MenuItem Header="_VSOnline" Template="{StaticResource VsOnline}" >
                <MenuItem Header="_Whatever" Template="{StaticResource VsMenuSub}" />
            </MenuItem>
            <MenuItem Header="_Dashboards" Template="{StaticResource VsMenuTop}">
                <MenuItem Header="_Overview" Template="{StaticResource VsMenuSub}" />
            </MenuItem>
            <MenuItem Header="_Code" Template="{StaticResource VsMenuTop}">
                <MenuItem Header="_Files" Template="{StaticResource VsMenuSub}" />
                <MenuItem Header="_Commits" Template="{StaticResource VsMenuSub}" />
                <MenuItem Header="_Pushes" Template="{StaticResource VsMenuSub}" />
            </MenuItem>
            <MenuItem Header="_Work" Template="{StaticResource VsMenuTop}">
                <MenuItem Header="_Backlogs" Template="{StaticResource VsMenuSub}" Icon="icon_backlogs.png" />
                <MenuItem Header="_Queries" Template="{StaticResource VsMenuSub}" Icon="icon_queries.png" />
                <Separator Template="{StaticResource VsMenuSep}" />
                <MenuItem Header="_New Work Item" Template="{StaticResource VsMenuSub}">
                    <MenuItem Header="_Epic" Template="{StaticResource VsMenuSub}" Icon="icon_epic.png" />
                    <MenuItem Header="_Feature" Template="{StaticResource VsMenuSub}" Icon="icon_feature.png" />
                    <MenuItem Header="_Issue" Template="{StaticResource VsMenuSub}" Icon="icon_issue.png" />
                    <MenuItem Header="_Task" Template="{StaticResource VsMenuSub}" Icon="icon_task.png" />
                    <MenuItem Header="_Test Case" Template="{StaticResource VsMenuSub}" Icon="icon_testcase.png" />
                    <MenuItem Header="_User Story" Template="{StaticResource VsMenuSub}" Icon="icon_userstory.png" />
                </MenuItem>
                <MenuItem Header="_Bug" Template="{StaticResource VsMenuSub}" Icon="icon_bug.png" />
            </MenuItem>
        </Menu>
    </StackPanel>
</Window>

The project is available here on github.

這篇關于如何在 WPF 中創建具有 Microsoft Web 應用程序樣式的菜單的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

LINQ to SQL and Concurrency Issues(LINQ to SQL 和并發問題)
Yield return from a try/catch block(try/catch 塊的收益回報)
Should I call Parameters.Clear when reusing a SqlCommand with a transation?(重用帶有事務的 SqlCommand 時,我應該調用 Parameters.Clear 嗎?)
what does a using statement without variable do when disposing?(處理時不帶變量的 using 語句有什么作用?)
Why doesn#39;t TransactionScope work with Entity Framework?(為什么 TransactionScope 不適用于實體框架?)
How to dispose TransactionScope in cancelable async/await?(如何在可取消的 async/await 中處理 TransactionScope?)
主站蜘蛛池模板: 数显恒温油浴-电砂浴-高温油浴振荡器-常州迈科诺仪器有限公司 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 热工多功能信号校验仪-热电阻热电偶校验仿真仪-金湖虹润仪表 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 广州昊至泉水上乐园设备有限公司 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 压滤机-洗沙泥浆处理-压泥机-山东创新华一环境工程有限公司 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | 微学堂-电动能源汽车评测_电动车性能分享网| 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | TPE塑胶原料-PPA|杜邦pom工程塑料、PPSU|PCTG材料、PC/PBT价格-悦诚塑胶 | 精密光学实验平台-红外粉末压片机模具-天津博君 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 盛源真空泵|空压机-浙江盛源空压机制造有限公司-【盛源官网】 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 内窥镜-工业内窥镜厂家【上海修远仪器仪表有限公司】 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 |