如何使用ICommand实现DockPanel或Image click?

时间:2013-11-05 18:35:39

标签: wpf vb.net image mvvm dockpanel

在我开始之前,这是一个小背景。我开始在WPF中创建我的应用程序,就像我以前在WinForms中编程一样。显然,这完全绕过了WPF的优势。所以现在我已经阅读了更多关于WPF和MVVM框架的内容,我开始调整我的应用程序以模型 - 视图 - ViewModel方式工作。

事先,我曾经使用Window的代码隐藏,只是处理了MouseDown RoutedEvents然后继续并提示一个签名窗口。我的DockPanel和Image似乎没有Command

我怎样才能以MVVM的方式做到这一点? RoutedEvents是解决这种情况的方法吗?

3 个答案:

答案 0 :(得分:5)

不要使用Behaviors和stuff复杂整个事物,而是将所有UI元素放在Button的ControlTemplate中并使用它的命令:

<Button Command="{Binding YourCommand}">
   <Button.Template>
      <ControlTemplate TargetType="Button">
          <DockPanel>
             <Image/>
             <!-- Whatever -->
          </DockPanel>
      </ControlTemplate>
   </Button.Template>
</Button>

答案 1 :(得分:1)

您可以使用Blend SDK附带的互动触发器。

步骤 -

  • 添加对程序集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类中。

答案 2 :(得分:1)

对于工具图片,请点击:

  1. 编写一个扩展 System.Windows.Control.Image 的类。
  2. 创建 RoutedEvent RoutedEventHandler 以方便鼠标 点击活动。
  3. 覆盖 OnMouseLeftButtonDown
  4. 在我的示例中,我评估了点击次数,因为我不知道如何做得更好

    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>