使用c#wpf的带有动态快捷键的动态菜单项
Dynamic menu items with dynamic shortcut keys using c# wpf
我关于 c# wpf 的问题
我正在使用 c# WPF 创建一个 windows 应用程序,我正在主 window 上创建菜单,使用来自数据库的代码隐藏 (c#) 菜单数据的菜单控件。我的数据库中还有一个 table 用于键盘快捷键数据。所以,我想在相应的菜单项中分配该快捷键值。我们怎样才能做到这一点?
简而言之如何为动态菜单项分配动态快捷键值?
例如,
菜单是_Transactions
菜单项是_Sales
子菜单项是_Add
子菜单项是 _Display
从数据库中快捷键数据
交易菜单的键值为 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)
{
}
这应该会让你们离得更近一些。
<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);
}
}
}
}
我关于 c# wpf 的问题
我正在使用 c# WPF 创建一个 windows 应用程序,我正在主 window 上创建菜单,使用来自数据库的代码隐藏 (c#) 菜单数据的菜单控件。我的数据库中还有一个 table 用于键盘快捷键数据。所以,我想在相应的菜单项中分配该快捷键值。我们怎样才能做到这一点?
简而言之如何为动态菜单项分配动态快捷键值?
例如, 菜单是_Transactions 菜单项是_Sales 子菜单项是_Add 子菜单项是 _Display
从数据库中快捷键数据 交易菜单的键值为 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)
{
}
这应该会让你们离得更近一些。
<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);
}
}
}
}