泥庭

2010年10月26日

ShortCutKeyとCommandBinding

Filed under: WPF — タグ: , , , — yone64 @ 2:35 AM

WindowsFormで、ショートカットキーを割り当てるのは比較的簡単にできます。
http://www.atmarkit.co.jp/fdotnet/dotnettips/208winshrtcutkey/winshrtcutkey.html

同じ感覚で、WPFでも、と思ったら結構はまりました。
最初に書いたXAML は、以下の通り。完全にWinFormののりです。

<Window x:Class="ShortCutKey.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Menu Height="23" Name="menu1" Width="200" Margin="0,0,302,288">
            <MenuItem Header="ファイル(_F)">
                <MenuItem Header="開く(_O)" InputGestureText="Ctrl+O" Command="{Binding Path=Command1}"/>
                <MenuItem Header="保存(_S)" InputGestureText="Ctrl+S" Command="{Binding Path=Command2}"/>
            </MenuItem>
            <MenuItem Header="編集(_E)" />
        </Menu>
    </Grid>
</Window>

で、やっぱり動きませんでした。

MSDNの解説によると、「メニュー項目にテキストを追加するだけです」とのこと。

http://msdn.microsoft.com/ja-jp/library/system.windows.controls.menuitem.inputgesturetext.aspx

調べていくと、KeyBindingを使えとのことなので、こんな感じになりました。

<Window x:Class="ShortCutKey.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.InputBindings>
        <KeyBinding Command="{Binding Path=Command1}" Gesture="Ctrl+O"/>
        <KeyBinding Command="{Binding Path=Command2}" Gesture="Ctrl+S"/>
    </Window.InputBindings>
    <Grid>
        <Menu Height="23" Name="menu1" Width="200" Margin="0,0,302,288">
            <MenuItem Header="ファイル(_F)">
                <MenuItem Header="開く(_O)" InputGestureText="Ctrl+O" Command="{Binding Path=Command1}"/>
                <MenuItem Header="保存(_S)" InputGestureText="Ctrl+S" Command="{Binding Path=Command2}"/>
            </MenuItem>
            <MenuItem Header="編集(_E)" />
        </Menu>
    </Grid>
</Window>

このXAML、一点注意があって.NET4だと期待通り動くのですが、3.5だとエラーが出ます。3.5ではKeyBInding.CommandがDependencyPropertyではないらしい。この場合、一度リソース登録等する必要があるようです。

検索中に、CommandReference(※)なるものを使っているサンプルを発見しました。

※MVVM Toolkitに含まれています。

http://wpf.codeplex.com/releases/view/14962

広告

WordPress.com Blog.