我正在使用CommandBindings修改一本书中的一些代码进行一些测试,我偶然发现了一个问题。
我想为剪切/复制/粘贴命令定义一个自定义行为,它既可以使用文本框中的常用组合键和上下文菜单,也可以使用标准菜单。 为了避免重新定义CommandBindings,我将它们声明为窗口资源。 一切都在文本框中运行良好,但我不知道如何在菜单项中使用它们。
这是我到目前为止的代码:
<Window x:Class="MySpellChecker.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MySpellChecker" Height="331" Width="508"
WindowStartupLocation ="CenterScreen" Focusable="True">
<Window.Resources>
<CommandBinding Command="ApplicationCommands.Open"
x:Key="OpenCmdBinding"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
<CommandBinding Command="ApplicationCommands.Save"
x:Key="SaveCmdBinding"
Executed="SaveCmdExecuted"
CanExecute="SaveCmdCanExecute"/>
<CommandBinding Command="ApplicationCommands.Copy"
x:Key="CopyCmdBinding"
Executed="ClipboardCmdExecuted"
CanExecute="ClipboardCmdCanExecute"/>
<CommandBinding Command="ApplicationCommands.Cut"
x:Key="CutCmdBinding"
Executed="ClipboardCmdExecuted"
CanExecute="ClipboardCmdCanExecute"/>
<CommandBinding Command="ApplicationCommands.Paste"
x:Key="PasteCmdBinding"
Executed="ClipboardCmdExecuted"
CanExecute="ClipboardCmdCanExecute"/>
</Window.Resources>
<DockPanel>
<!--Doc menu system on the top-->
<Menu DockPanel.Dock ="Top"
HorizontalAlignment="Left" Background="White" BorderBrush ="Black">
<MenuItem Header="_File" >
<MenuItem Command ="ApplicationCommands.Open"/>
<MenuItem Command ="ApplicationCommands.Save"/>
<Separator/>
<MenuItem Header ="_Exit"
MouseEnter ="MouseEnterExitArea"
MouseLeave ="MouseLeaveArea"
Click ="FileExit_Click"/>
</MenuItem>
<MenuItem Header="_Edit">
<MenuItem Command ="ApplicationCommands.Copy"/>
<MenuItem Command ="ApplicationCommands.Cut"/>
<MenuItem Command ="ApplicationCommands.Paste"/>
</MenuItem>
<MenuItem Header="_Tools">
<MenuItem Header ="_Spelling Hints"
MouseEnter ="MouseEnterToolsHintsArea"
MouseLeave ="MouseLeaveArea"
Click ="ToolsSpellingHints_Click"/>
</MenuItem>
</Menu>
<!-- Put Toolbar under the Menu -->
<ToolBar DockPanel.Dock ="Top" >
<Button Content ="Exit" MouseEnter ="MouseEnterExitArea"
MouseLeave ="MouseLeaveArea" Click ="FileExit_Click"/>
<Separator/>
<Button Content ="Check" MouseEnter ="MouseEnterToolsHintsArea"
MouseLeave ="MouseLeaveArea" Click ="ToolsSpellingHints_Click"
Cursor="Help" />
</ToolBar>
<!-- Put a StatusBar at the bottom -->
<StatusBar DockPanel.Dock ="Bottom"
Background="Beige" >
<StatusBarItem>
<TextBlock Name="statBarText" Text ="Ready"/>
</StatusBarItem>
</StatusBar>
<Grid DockPanel.Dock ="Left" Background ="AliceBlue">
<!-- Define the rows and columns -->
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column ="0" Width ="5" Background ="Gray" />
<StackPanel Grid.Column="0" VerticalAlignment ="Stretch" >
<Label Name="lblSpellingInstructions"
FontSize="14" Margin="10,10,0,0">Spelling Hints</Label>
<Expander Name="expanderSpelling" Header ="Try these!" Margin="10,10,10,10">
<!-- This will be filled programmatically -->
<Label Name ="lblSpellingHints" FontSize ="12"/>
</Expander>
</StackPanel>
<!-- This will be the area to type within -->
<TextBox Grid.Column ="1"
SpellCheck.IsEnabled ="True"
AcceptsReturn ="True"
Name ="txtData" FontSize ="14"
BorderBrush ="Blue" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<TextBox.CommandBindings>
<StaticResource ResourceKey="CutCmdBinding"/>
<StaticResource ResourceKey="CopyCmdBinding"/>
<StaticResource ResourceKey="PasteCmdBinding"/>
</TextBox.CommandBindings>
</TextBox>
</Grid>
</DockPanel>
在这种情况下,如果我在文本框中写了一些内容,我可以使用键盘快捷键,上下文菜单中的剪切/复制/粘贴,并且可以从主菜单中充分地使用。尽管在我在文本框上书写之前某些内容显然不能正常工作,但所有“编辑”菜单项都是禁用的,更重要的是,“文件”菜单项永远不会起作用。如果我在Window.Commandbindings中声明命令绑定,它们会起作用,但是我又试图理解是否可能只定义命令及其行为一次,然后无论控制使用它们,都可以通过应用程序重复使用它们。
有什么想法吗? 提前谢谢!