2

私はまだコマンドとRoutedEventsで経験を積んでいます。RoutedCommandsを使わずに、とてもシンプルなプログラムを実現しようとしています。

これが私のコマンドクラスです:

public class ColorChanger : ICommand
{
    public static readonly RoutedEvent ChangeMyColor = EventManager.RegisterRoutedEvent("ChangeMyColor", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(ColorChanger));

    public void Execute(object parameter)
    {
        RoutedEventArgs eventArgs  = new RoutedEventArgs(ChangeMyColor);
        Keyboard.FocusedElement.RaiseEvent(eventArgs);
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public static void AddChangeMyColorHandler(DependencyObject o, RoutedEventHandler handler)
    {
        ((UIElement)o).AddHandler(ColorChanger.ChangeMyColor, handler);
    }

    public static void RemoveChangeMyColorHandler(DependencyObject o, RoutedEventHandler handler)
    {
        ((UIElement)o).AddHandler(ColorChanger.ChangeMyColor, handler);
    }
}

そのコマンドに静的にアクセスできるようにするために、すべてのコマンドを保持するための静的クラスを作成しました。

 public static class AppCommands
{
    private static ColorChanger colorChanger = new ColorChanger();

    public static ColorChanger ColorChanger
    {
        get { return colorChanger; }
    }
}

これは、私のMainWindow.xamlにあるものです。

<StackPanel>
    <Menu>
        <MenuItem Command="{x:Static local:AppCommands.ColorChanger}" Header="ClickMe"
          CommandTarget="{Binding ElementName=mainTextBox}" x:Name="menue1"/>
    </Menu>
    <TextBox Name="mainTextBox"/>
</StackPanel>

私が欲しいのは、menue1-itemをクリックすると、「mainTextBox」の背景が変わることです。それでは、私のMainWindow.csの内部を見てみましょう。

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        AddHandler(ColorChanger.ChangeMyColor,new RoutedEventHandler(test));
    }

    public void test(object sender, RoutedEventArgs args)
    {
        Control someCtl = (Control) args.OriginalSource;
        someCtl.Background = Brushes.BlueViolet;
    }
}

プログラムは機能していますが、正しくありません:)常にメインウィンドウの背景を変更しますが、コマンドターゲットの背景は変更しません。

だから-私は何が間違っているのですか?何か忘れましたか?

4

1 に答える 1

0

OriginalSource純粋なヒット テストに基づくイベントのレポート ソースです。http://msdn.microsoft.com/en-us/library/system.windows.routedeventargs.originalsource.aspxを参照してください。

この場合、ビジュアル ツリー内のどの子要素にも解決されないため、ウィンドウが返されます。

CommandTarget にアクセスするには、 を使用する必要がありますargs.Source

于 2013-04-11T18:21:12.113 に答える