WPF Menu的使用(轉)


Menu的使用

1.1 MenuData.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<Data xmlns="">
<Operation Name="部門管理" Gesture="F" Ico="/Images/out.ico">
<Operation Name="部門列表" Gesture="Control+P" Uid="/Department/DpmtList.xaml" Model="Jump"/>
<Operation Name="新增部門" Gesture="Control+W" Uid="/Department/AddDpmt.xaml" Model="Show"/>
</Operation>
<Operation Name="員工管理" Gesture="E" Ico="/Images/admin.ico">
<Operation Name="員工列表" Gesture="Control+C" Uid="/Employee/EmpList.xaml" Model="Jump"/>
<Operation Name="新增員工" Gesture="Control+X" Uid="/Employee/AddEmp.xaml" Model="Show"/>
</Operation>
</Data>
1.2 前台代碼

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="菜單" Height="500" Width="800" WindowStartupLocation="CenterScreen">
<Window.Resources>
<!--數據源-->
<XmlDataProvider x:Key="dsMenu" Source="MenuData.xml" XPath="Data/Operation" />
<!--菜單模板-->
<HierarchicalDataTemplate DataType="Operation" ItemsSource="{Binding XPath=Operation}">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding XPath=@Ico}" Height="24" Width="24" Margin="10,0" />
<TextBlock Text="{Binding XPath=@Name}" Margin="10,0"/>
<TextBlock Text="{Binding XPath=@Gesture}" />
</StackPanel>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="24"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!--菜單-->
<StackPanel Grid.Row="0" MenuItem.Click="StackPanel_Click_1">
<Menu ItemsSource="{Binding Source={StaticResource dsMenu}}"/>
</StackPanel>
<!--顯示內容-->
<Frame Grid.Row="1" x:Name="mainFrame" Source="/Index.xaml" NavigationUIVisibility="Hidden"/>
</Grid>
</Window>
1.3 后台代碼

/// <summary>
/// 菜單點擊事件
/// </summary>
private void StackPanel_Click_1(object sender, RoutedEventArgs e)
{
MenuItem mi = e.OriginalSource as MenuItem;
XmlElement xe = mi.Header as XmlElement;
string name = xe.Attributes["Name"].Value;
string uid = xe.Attributes["Uid"].Value;
string model = xe.Attributes["Model"].Value;
//Jump:使用Frame跳轉頁面;Show:使用NavigationWindow彈出頁面
if (model == "Jump")
{
JumpPage(uid);
}
else if (model == "Show")
{
ShowPage(Name, uid);
}
}

/// <summary>
/// 使用Frame跳轉頁面
/// </summary>
private void JumpPage(string uid)
{
if (!String.IsNullOrWhiteSpace(uid))
{
this.mainFrame.Navigate(new Uri(uid, UriKind.Relative));
}
}

/// <summary>
/// 使用NavigationWindow彈出頁面
/// </summary>
private void ShowPage(string title,string uri)
{
NavigationWindow window = new NavigationWindow();
window.Title = title;
window.Width = 300;
window.Height = 200;
window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
window.ResizeMode = ResizeMode.NoResize;
window.Source = new Uri(uri, UriKind.Relative);
window.ShowsNavigationUI = false;
window.Show();
}
2、TreeView的使用

2.1 前台代碼

<Window x:Class="WpfApplication1.Test.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="菜單" Height="500" Width="800" WindowStartupLocation="CenterScreen">
<Window.Resources>
<!--菜單樣式-->
<Style TargetType="{x:Type TreeView}">
<Setter Property="Height" Value="550"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Background" Value="#059ad7"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Padding" Value="5,10,0,0"/>
</Style>
<!--菜單項樣式-->
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="FontSize" Value="16"/>
<Setter Property="Padding" Value="5"/>
<Setter Property="Cursor" Value="Hand"/>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="190"/>
<ColumnDefinition Width="3"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!--菜單-->
<StackPanel Grid.Column="0" Background="#059ad7">
<TreeView x:Name="tvMenu" SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeViewItem Header="菜單" IsExpanded="True" >
<TreeViewItem Header="部門管理" IsExpanded="True" >
<TreeViewItem Header="部門列表" Uid="/Department/DpmtList.xaml"/>
<TreeViewItem Header="新增部門" Uid="/Department/AddDpmt.xaml"/>
</TreeViewItem >
<TreeViewItem Header="員工管理" IsExpanded="True">
<TreeViewItem Header="員工列表" Uid="/Employee/EmpList.xaml"/>
<TreeViewItem Header="新增員工" Uid="/Employee/AddEmp.xaml"/>
</TreeViewItem >
</TreeViewItem>
</TreeView>
</StackPanel>
<!--隔欄-->
<GridSplitter Grid.Column="1" VerticalAlignment="Stretch" HorizontalAlignment="Center" Background="#c3c1c1" ShowsPreview="True" Width="3" />
<!--中間內容-->
<Frame Grid.Column="3" x:Name="mainFrame" Source="/Index.xaml" NavigationUIVisibility="Hidden"/>
</Grid>
</Window>
2.2 后台代碼

/// <summary>
/// 菜單跳轉事件
/// </summary>
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeView tvMenu = sender as TreeView;
TreeViewItem tvItem = tvMenu.SelectedItem as TreeViewItem;
string uid = tvItem.Uid;
if (!String.IsNullOrWhiteSpace(uid))
{
this.mainFrame.Navigate(new Uri(uid, UriKind.Relative));
}
}
3、其他內容

1、Menu

Menu 是水平放置它的項的,默認情況下把灰色欄作為背景。
把Menu 添加到它的ItemsControl 基類的唯一公開的API 是IsMainMenu 屬性。當為true(默認的)時,用戶按下Alt 或者F10 鍵,菜單獲得焦點。
MenuItem 是帶頭的Items 控件(繼承自HeaderedItemControl),它的頭實際上是主對象。如果Items 是子元素的話就會被作為
子菜單顯示。MenuItem 使用下划線前綴來支持訪問鍵(access key)。
Separator(分隔線)是一種簡單控件。
Icon——允許把任意類型的對象添加到Header 旁邊。Icon 對象會像Header 一樣被渲染,盡管它通常是一幅小圖片。
IsCheckable——讓MenuItem 的行為像一個CheckBox 控件。
InputGestureText——用一個相關的手勢(gesture)來標識一個項(最常見的就是鍵盤快捷方式,比如Ctrl+O)。
5個事件:Checked、Unchecked、SubmenuOpened、SubmenuClosed 和Click。
要為MenuItem 設置一個鍵盤快捷鍵,你應該用它的Command 屬性。
2、ContextMenu(上下文菜單)

是一種保存MenuItem 和Separator 的簡單容器。但不能直接把ContextMenu 嵌入到一個元素樹中,必須通過一個適當的屬性把它加載到控件上。
IsOpen 屬性以及Opened/Closed 事件。
默認情況下,菜單左上角位於鼠標指針處,但是可以把它的Placement 改成一個非MousePoint 的值(如Absolute),或者設置它的HorizontalOffset 以及VerticalOffset 屬性,來調整這個行為。
ContextMenuService 靜態類,它包含了許多附加屬性,分別對應那些由ContextMenu 直接定義的屬性。
3、其他Items 控件

A、TreeView

用可展開和折疊的節點來分層顯示數據。
在TreeView 中一定要顯式地用TreeViewItem 包裝Item,用TreeViewItem來填充,TreeViewItem 就像MenuItem 一樣,是一種帶有頭的控件,它的Header 屬性包含着當前的項,而它的Items 集合中保存着子項(子項也是TreeViewItem)。
TreeViewItem 有兩個方便的屬性IsExpanded 和IsSelected。還有4 個事件,分別對應於這兩個屬性的4種狀態:Expanded、Collapsed、Selected 和Unselected。
同樣支持富鍵盤導航,加號和減號鍵可以展開或折疊一個項,箭頭方向鍵、Page Up、Page Down、Home 和End 鍵可以從一個項向另一個項移動焦點。
B、ToolBar

對許多小的按鈕(或者其他控件)進行分組。
ToolBar 可以被放在元素樹的任何地方,但是通常把它們放在一個叫作ToolBarTray 的FrameworkElement 中。
用戶就可以拖曳ToolBar 或重新定義ToolBar,。除非ToolBarTray的IsLocked 屬性被設置為true。
ToolBarTray 有一個Orientation 屬性,可以把它設置為Vertical 使其所有的ToolBar 垂直排列項。
默認都是最后一個元素第一個被移到溢出區域,但是你能通過OverflowMode 附加屬性來控制每個項的溢出行為。有了這個屬性,你就可以把一個項標記為AsNeeded(默認,按需要溢出)、Always 或Never。
System.Windows.Input 命名空間中的KeyboardNavigat ion 類定義了一些用來自定義鍵盤行為的附加屬性。
ToolBar 實際上是一個帶有頭的Item 控件(就像MenuItem 和TreeViewItem)。它的Header 屬性從來不會被顯示,但是它可以被用來實現ToolBarTray 的其他特性。
C、StatusBar

StatusBar 的行為就像Menu,它只是水平排列放它的項,通常用在窗口底部,以顯示狀態信息。
StatusBar 為Separator 提供了一個控件模板,Separator 是作為垂直線被渲染的。
StatusBar 中的項(除了Separator)是被隱式地包裝在一個StatusBarItem 中,但是你依然能顯式地進行包裝。
---------------------
作者:pan_junbiao
來源:CSDN
原文:https://blog.csdn.net/pan_junbiao/article/details/50987434
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM