WPF コマンド、アプリケーション レベルのコマンドを宣言するには? 質問する

WPF コマンド、アプリケーション レベルのコマンドを宣言するには? 質問する

WPF アプリケーション内のどこからでも利用できるコマンドを作成することに興味があります。

これらを、、Cutおよびその他のアプリケーション レベルのコマンドと同じように動作させたいと思います。CopyPaste

<Button Command="Paste" />

Application インスタンスに CommandBindings を設定できると想定していましたが、そのプロパティは使用できません。

これはどうやって行うのですか?

これまでのところ、私が管理できた最善の方法は、トップレベル ウィンドウに一連のコマンドを作成し、次のようにアクセスすることです。

<Button Command="{x:Static namespace::MainWindow.CommandName}" />

これは機能しますが、もちろん密に結合されているため、非常に脆弱です。

ベストアンサー1

WPF アプリケーションの「すべてのウィンドウ」に対して CommandBindings を設定し、Application クラスにコマンド ハンドラーを実装できます。

まず、静的コマンドコンテナクラスを作成します。たとえば、

namespace WpfApplication1 
{
    public static class MyCommands
    {
        private static readonly RoutedUICommand doSomethingCommand = new RoutedUICommand("description", "DoSomethingCommand", typeof(MyCommands));

        public static RoutedUICommand DoSomethingCommand
        {
            get
            {
                return doSomethingCommand;
            }
        }
    }
}

次に、カスタム コマンドを Button.Command に次のように設定します。

<Window x:Class="WpfApplication1.MainWindow"
        ...
        xmlns:local="clr-namespace:WpfApplication1">
    <Grid>
        ...
        <Button Command="local:MyCommands.DoSomethingCommand">Execute</Button>
    </Grid>
</Window>

最後に、Application クラスにカスタム コマンドのコマンド ハンドラーを実装します。

namespace WpfApplication1 
{

    public partial class App : Application
    {
        public App()
        {
            var binding = new CommandBinding(MyCommands.DoSomethingCommand, DoSomething, CanDoSomething);

            // Register CommandBinding for all windows.
            CommandManager.RegisterClassCommandBinding(typeof(Window), binding);
        }

        private void DoSomething(object sender, ExecutedRoutedEventArgs e)
        {
            ...
        }

        private void CanDoSomething(object sender, CanExecuteRoutedEventArgs e)
        {
            ...
            e.CanExecute = true;
        }
    }
}

おすすめ記事