0

始める前に、少し背景を説明します。WinForms でプログラミングするのと同じ方法で、WPF でアプリケーションの作成を開始しました。明らかに、これは WPF の強みを完全にバイパスしています。WPF と MVVM フレームワークについて詳しく読んだので、Model - View - ViewModel の方法で動作するようにアプリケーションを適応させ始めています。

以前は、ウィンドウのコード ビハインドを使用して、MouseDown RoutedEvents を処理してから、署名を求めるウィンドウに進みました。DockPanel と Image にCommand.

これをMVVMの方法で行うにはどうすればよいですか? RoutedEvents はこの状況に対応する方法ですか?

4

3 に答える 3

9

Behaviors などで全体を複雑にする代わりに、すべての UI 要素を Button の ControlTemplate 内に配置し、それの Command を使用します。

<Button Command="{Binding YourCommand}">
   <Button.Template>
      <ControlTemplate TargetType="Button">
          <DockPanel>
             <Image/>
             <!-- Whatever -->
          </DockPanel>
      </ControlTemplate>
   </Button.Template>
</Button>
于 2013-11-05T19:47:59.517 に答える
3

Blend SDKに付属のインタラクティブ トリガーを使用できます。

手順-

  • assembly への参照を追加しますSystem.Windows.Interactivity

  • 対応する名前空間を XAML ファイルに追加します

    xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

例のように使用できます-

<StackPanel>
   <interactivity:Interaction.Triggers>
      <interactivity:EventTrigger EventName="MouseDown">
        <interactivity:InvokeCommandAction Command="{Binding CloseCommand}"/>
      </interactivity:EventTrigger>
   </interactivity:Interaction.Triggers>            
</StackPanel>

ここで、CloseCommand は ViewModel クラスにあります。

于 2013-11-05T18:49:56.207 に答える
1

画像をクリックして実装するには:

  1. System.Windows.Control.Imageを拡張するクラスを作成します。
  2. RoutedEventRoutedEventHandlerを作成して、マウス クリック イベントを容易にします。
  3. OnMouseLeftButtonDown をオーバーライドする

私の例では、クリック数を評価します。これを改善する方法がわからないためです

public class ImageHelper : Image
    {
        public static readonly RoutedEvent MouseLeftButtonClick =
            EventManager.RegisterRoutedEvent(
                "MouseLeftButtonClick",
                RoutingStrategy.Bubble,
                typeof(RoutedEventHandler),
                typeof(ImageHelper));

        public event RoutedEventHandler MouseLeftButtonClickEvent
        {
            add
            {
                AddHandler(MouseLeftButtonClick, value);
            }
            remove
            {
                RemoveHandler(MouseLeftButtonClick, value);
            }
        }

        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            if (e.ClickCount == 1)
            {
                RaiseEvent(new MouseLeftButtonClickEventArgs(
                    MouseLeftButtonClick, this));
            }
            base.OnMouseLeftButtonDown(e);
        }

        public class MouseLeftButtonClickEventArgs : RoutedEventArgs
        {
            public MouseLeftButtonClickEventArgs(RoutedEvent routedEvent, object source)
                : base(routedEvent, source)
            {
               // some code.....
            }
        }
    }

XAML:

<local:ImageHelper>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonClickEvent">
                    <i:InvokeCommandAction Command="{Binding Path=MyCommand}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
 </local:ImageHelper>
于 2013-11-05T19:11:20.080 に答える