我關于 c# wpf 的問題
我正在使用 c# WPF 創建一個 Windows 應用程式,我正在使用來自資料庫的代碼隱藏 (c#) 選單資料的選單控制元件在主視窗上創建選單。我的資料庫中還有一張表用于鍵盤快捷鍵資料。因此,我想在相應的選單項中分配該快捷鍵值。我們怎樣才能做到這一點?
總之,如何為動態選單項分配動態快捷鍵值?
例如,選單是 _Transactions 選單項是 _Sales 子選單項是 _Add 子選單項是 _Display
來自資料庫 KeyValue for Transaction Menu 的快捷鍵資料是 Alt T
示例代碼是...
try
{
menuContainer.Children.Clear();
System.Windows.Controls.Menu topMenu = new
System.Windows.Controls.Menu();
DataTable dtMainMenu = Global.DatabaseMethod.GetMenuData();
DataTable dtSubMenu = null;
DataTable dtChildMenu = null;
DataTable dtSubChildMenu = null;
if (dtMainMenu != null && dtMainMenu.Rows.Count > 0)
{
MenuItem parentMenuItem = null;
MenuItem subMenuItem = null;
MenuItem childMenuItem = null;
MenuItem subchildMenuItem = null;
DataRow[] dataRow = null;
dtMainMenu.DefaultView.Sort = "SequenceNumber ASC";
dtMainMenu = dtMainMenu.DefaultView.ToTable();
foreach (DataRow parentMenuRow in dtMainMenu.Rows)
{
parentMenuItem = new MenuItem();
parentMenuItem.Tag =
parentMenuRow[ColumnNameConstants.Slug].ToString() "~"
parentMenuRow[ColumnNameConstants.ID].ToString();
parentMenuItem.Header =
parentMenuRow[ColumnNameConstants.MenuName].ToString();
dataRow = Global.dtUserRole.Select("((MenuId='"
Convert.ToInt32(parentMenuRow[ColumnNameConstants.ID]) "' AND
SubMenuId=0 AND ChildMenuId=0) OR (MenuId='"
Convert.ToInt32(parentMenuRow[ColumnNameConstants.ID]) "'))");
parentMenuItem.PreviewMouseDown =
MenuItem_PreviewMouseDown;
parentMenuItem.PreviewKeyDown =
MenuItem_PreviewKeyDown;
if (dataRow.Length > 0)
{
topMenu.Items.Add(parentMenuItem);
if (!Convert.ToBoolean(dataRow[dataRow.Length -
1][ColumnNameConstants.VisibleRole]))
{
parentMenuItem.Visibility =
Visibility.Collapsed;
}
}
else
{
topMenu.Items.Add(parentMenuItem);
parentMenuItem.Visibility =
Visibility.Collapsed;
}
}
topMenu.Background = Brushes.Transparent;
topMenu.Foreground = Brushes.White;
topMenu.VerticalAlignment = VerticalAlignment.Center;
menuContainer.Children.Add(topMenu);
}
}
catch (Exception ex)
{
}
uj5u.com熱心網友回復:
這應該會讓你更接近一點。
<Window x:Class="WpfApp11.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:WpfApp11"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid>
<Menu x:Name="mainmenu" VerticalAlignment="Top"/>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp11
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, ICommand
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
MenuItem filemenu = new MenuItem();
filemenu.Header = "_File";
MenuItem menuitem1 = new MenuItem();
menuitem1.Header = "Item _1";
menuitem1.InputGestureText = "Ctrl A";
//menuitem1.Click = menuitem_Click;
//menuitem1.Tag = "slug1~id1"; //parentMenuRow[ColumnNameConstants.Slug].ToString() "~" parentMenuRow[ColumnNameConstants.ID].ToString();
menuitem1.CommandParameter = "slug1~id1"; //parentMenuRow[ColumnNameConstants.Slug].ToString() "~" parentMenuRow[ColumnNameConstants.ID].ToString();
menuitem1.Command = this;
MenuItem menuitem2 = new MenuItem();
menuitem2.Header = "Item _2";
menuitem2.InputGestureText = "Ctrl B";
//menuitem2.Click = menuitem_Click;
//menuitem2.Tag = "slug2~id2"; //parentMenuRow[ColumnNameConstants.Slug].ToString() "~" parentMenuRow[ColumnNameConstants.ID].ToString();
menuitem2.CommandParameter = "slug2~id2"; //parentMenuRow[ColumnNameConstants.Slug].ToString() "~" parentMenuRow[ColumnNameConstants.ID].ToString();
menuitem2.Command = this;
filemenu.Items.Add(menuitem1);
filemenu.Items.Add(menuitem2);
mainmenu.Items.Add(filemenu);
this.InputBindings.Add(new KeyBinding(this, Key.A, ModifierKeys.Control) { Command = this, CommandParameter = "slug1~id1" });
this.InputBindings.Add(new KeyBinding(this, Key.B, ModifierKeys.Control) { Command = this, CommandParameter = "slug2~id2" });
}
//----------------------------------------------------------------------
private void menuitem_Click(object sender, RoutedEventArgs e)
{
MenuItem menu = sender as MenuItem;
if (menu != null)
{
MessageBox.Show(menu.Tag as string);
e.Handled = true;
}
}
//----------------------------------------------------------------------
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested = value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
string item = parameter as string;
if (item == "slug1~id1")
{
// Decide if command should be enabled of not
return true;
}
if (item == "slug2~id2")
{
// Decide if command should be enabled of not
return true;
}
return false;
}
public void Execute(object parameter)
{
ExecuteItem(parameter);
}
//----------------------------------------------------------------------
private void ExecuteItem(object parameter)
{
string item = parameter as string;
if (item != null)
{
MessageBox.Show(item);
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/357660.html
