上圖爲Edge瀏覽器現有的菜單內容,菜單中即有子菜單也有組合菜單。html
本章節將開發瀏覽器菜單樣式,菜單部分功能將後期進行處理。git
新建用戶控件命名爲WebMenuUc,Grid添加以下代碼web
<controls:MMenu> <controls:MMenuItem Header=". . ." Width="40" Height="30"> <controls:MMenuItem Header="新建標籤頁" Icon=""/> <controls:MMenuItem Header="新建窗口" Icon=""/> <controls:MMenuItem Header="新建InPrivate窗口" Icon=""/> // to do <controls:MMenuItem Header="收藏夾" Icon=""/> <controls:MMenuItem Header="歷史記錄" Icon=""/> <controls:MMenuItem Header="下載" Icon=""/> <controls:MMenuItem Header="應用" Icon="" PopupWidth="160"> <controls:MMenuItem Header="管理應用" Icon=""/> </controls:MMenuItem> <controls:MMenuItem Header="擴展" Icon=""/> <controls:MMenuItem Header="集錦" Icon=""/> <controls:MMenuItem Header="打印" Icon=""/> <controls:MMenuItem Header="共享" Icon=""/> <controls:MMenuItem Header="在頁面上查找" Icon=""/> <controls:MMenuItem Header="大聲朗讀" Icon=""/> <controls:MMenuItem Header="更多工具" > <controls:MMenuItem Header="更多工具1" /> <controls:MMenuItem Header="更多工具2" /> <controls:MMenuItem Header="更多工具3" /> </controls:MMenuItem> <controls:MMenuItem Header="設置" Icon=""/> <controls:MMenuItem Header="幫助和反饋" Icon=""/> <controls:MMenuItem Header="關閉 瀏覽器"/> </controls:MMenuItem> </controls:MMenu>
其中MMenu及MMenuItem均爲CustomControl,分別重寫了Menu和MenuItem,瀏覽器
關於Menu CustomControl 基本樣式可參考 Cys_Control(五) MMenu,工具
對Cys_Control 中MMenu 部分樣式及配色進行了調整,使其接近於Edge Menu。以下post
其中圖標使用阿里Iconfont,此時還缺乏縮放部分url
在新建InPrivate窗口 菜單下增長縮放部分spa
<controls:MMenuItem Header="新建InPrivate窗口" Icon=""/> <Grid Height="30"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Border Grid.Column="0" > <TextBlock Text="縮放" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <Border Grid.Column="1" BorderThickness="1,0" BorderBrush="{DynamicResource WebBrowserBrushes.WebMenuDivisionBorderBrush}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Button Grid.Column="0" Content="" Style="{DynamicResource Button.FontButton}" /> <TextBlock Grid.Column="1" Text="100%" Margin="9,0" VerticalAlignment="Center"/> <Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/> </Grid> </Border> <Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/> </Grid> <controls:MMenuItem Header="收藏夾" Icon=""/>
此時雖然菜單已添加,但鼠標停留時的藍色背景沒法去掉code
暫未找到合適處理方式,故考慮擴展Role屬性xml
Role有四個枚舉值即 TopLevelHeader、TopLevelItem、SubmenuHeader、SubmenuItem 分別對應四種樣式
能夠將縮放部分視爲第五種樣式,增長枚舉 MenuItemRoleEx 這裏爲了方便使枚舉值與 MenuItemRole 枚舉值命名相近,結尾增長Ex,並多加一個None做爲默認屬性值
public enum MenuItemRoleEx { // // Summary: // Top-level menu item that can invoke commands. TopLevelItemEx = 0, // // Summary: // Header for top-level menus. TopLevelHeaderEx = 1, // // Summary: // Menu item in a submenu that can invoke commands. SubmenuItemEx = 2, // // Summary: // Header for a submenu. SubmenuHeaderEx = 3,
None = 4, }
爲MMenuItem類文件中增長依賴屬性 RoleEx
public static readonly DependencyProperty RoleExProperty = DependencyProperty.Register("RoleEx", typeof(MenuItemRoleEx), typeof(MMenuItem), new PropertyMetadata(MenuItemRoleEx.None)); /// <summary> /// RoleEx /// </summary> public MenuItemRoleEx RoleEx { get => (MenuItemRoleEx)GetValue(RoleExProperty); set => SetValue(RoleExProperty, value); }
在MMenuItem樣式文件中增長 擴展模板以下
<ControlTemplate xmlns:markup="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Cys_CustomControls.Controls" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x:Key="MSubmenuItemExpandTemplate" TargetType="{markup:Type local:MMenuItem}"> <Border x:Name="templateRoot" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Height="35" SnapsToDevicePixels="true"> <Grid Height="30"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Border Grid.Column="0" > <TextBlock Text="縮放" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <Border Grid.Column="1" BorderThickness="1,0" BorderBrush="{TemplateBinding BorderBrush}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Button Grid.Column="0" Content="" Style="{DynamicResource Button.FontButton}" /> <TextBlock Grid.Column="1" Text="100%" Margin="9,0" VerticalAlignment="Center"/> <Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/> </Grid> </Border> <Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/> </Grid> </Border> </ControlTemplate>
併爲MMenuItem默認樣式增長多條件觸發器,即當Role爲 SubmenuItem並RoleEx爲 SubmenuItemEx時使用擴展模板
<MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Role" Value="SubmenuItem"/> <Condition Property="RoleEx" Value="SubmenuItemEx"/> </MultiTrigger.Conditions> <Setter Property="Template" Value="{StaticResource MSubmenuItemExpandTemplate}"/> <Setter Property="BorderThickness" Value="0,1,0,1"/> <Setter Property="BorderBrush" Value="{DynamicResource WebBrowserBrushes.WebMenuDivisionBorderBrush}"/> </MultiTrigger>
此時運行看菜單效果,鼠標滑過期無藍色背景