3

WPF アプリケーションで、画像タイプの画像が「n」個あり、いずれかの画像 (画像タイプ) をクリックすると、その表示が崩れるとします。これを行う通常の方法は、すべての画像の「クリック」イベントごとに折りたたむコードを記述することです。
画像タイプの UIelement(picture) がクリックされるたびに、その特定の要素(picture) が折りたたまれることをアプリケーションが理解できるようにする別の方法はありますか?
コードを減らしたいのですが、どうすればこれを達成できますか?

4

3 に答える 3

3

これらがルーティング イベントであるという事実を利用して、親要素に単一のハンドラーを設定できます。

これにより、1 つのイベント ハンドラで子コントロールのすべてのイベントを処理できます。イベント引数のOriginalSourceプロパティは、クリックされた UIElement を提供します (たとえば、サブスクライブしたUIElement.MouseLeftButtonDown場合、または同様の「共有」イベント)。


これを行うには、XAML でコンテナーに次を追加します。

<Grid UIElement.MouseLeftButtonDown="CommonClickHandler">
    <!-- Your elements here -->

次に、コード ビハインドで次のようにします。

private void CommonClickHandler(object sender, MouseButtonEventArgs e)
{
    Image picture = e.OriginalSource as Image;  //OriginalSource is the original element
    if (picture != null)
        picture.Visibility = Visibility.Collapsed;
}
于 2013-08-02T19:45:01.523 に答える
2

このようにEventManager.RegisterClassHandlerを使用してグローバルハンドラーを追加できます-

    public MainWindow()
    {
        InitializeComponent();
        EventManager.RegisterClassHandler(typeof(Image), Image.MouseDownEvent,
              new RoutedEventHandler(OnMouseDown));
    }

    private void OnMouseDown(object sender, RoutedEventArgs e)
    {
        (sender as Image).Visibility = System.Windows.Visibility.Collapsed;
    }
于 2013-08-02T19:52:21.723 に答える
1

複数のイベント ハンドラーで使用しているメソッドを登録し、パラメーターを使用して特定のコントロールにアクセスし、使用しているObject senderコントロールの型にキャストすることができます。

myControl.Click += new EventHandler(myGenericClickMethod);

public void myGenericClickMethod(Object sender, EventArgs e)
{
  Image myImage = (Image) sender;
  myImage..Visibility = System.Windows.Visibility.Collapsed;
}
于 2013-08-02T19:43:28.607 に答える