CommandBindings作为MenuItem中的静态资源

时间:2016-06-29 09:26:29

标签: c# wpf menuitem copy-paste commandbinding

我正在使用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中声明命令绑定,它们会起作用,但是我又试图理解是否可能只定义命令及其行为一次,然后无论控制使用它们,都可以通过应用程序重复使用它们。

有什么想法吗? 提前谢谢!

0 个答案:

没有答案