首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DockPanel实现ICommand或图像单击?

如何使用DockPanel实现ICommand或图像单击?
EN

Stack Overflow用户
提问于 2013-11-05 18:35:39
回答 3查看 2.8K关注 0票数 0

这是我开始之前的一些背景。我开始用WPF创建我的应用程序,就像我以前在WinForms中编程一样。显然,这完全绕过了WPF的力量。现在我已经阅读了更多关于WPF和MVVM框架的内容,我开始调整我的应用程序,使其能够以Model ViewModel的方式工作。

在此之前,我曾经有我的窗口后面的代码,只需处理MouseDown RoutedEvents,然后继续并提示一个窗口进行签名。我的DockPanel和图像似乎没有Command

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-05 19:47:59

将所有UI元素放入按钮的ControlTemplate中并使用它的命令,而不是将行为和内容复杂化:

代码语言:javascript
复制
<Button Command="{Binding YourCommand}">
   <Button.Template>
      <ControlTemplate TargetType="Button">
          <DockPanel>
             <Image/>
             <!-- Whatever -->
          </DockPanel>
      </ControlTemplate>
   </Button.Template>
</Button>
票数 9
EN

Stack Overflow用户

发布于 2013-11-05 18:49:56

您可以使用共混SDK附带的交互触发器。

Steps -

  • 添加对程序集System.Windows.Interactivity的引用。
  • 在XAML文件中添加相应的命名空间 xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

你可以把它当作一个例子-

代码语言:javascript
复制
<StackPanel>
   <interactivity:Interaction.Triggers>
      <interactivity:EventTrigger EventName="MouseDown">
        <interactivity:InvokeCommandAction Command="{Binding CloseCommand}"/>
      </interactivity:EventTrigger>
   </interactivity:Interaction.Triggers>            
</StackPanel>

这里,CloseCommand在您的ViewModel类中。

票数 3
EN

Stack Overflow用户

发布于 2013-11-05 19:11:20

要实现图像,请单击:

  1. 编写扩展System.Windows.Control.Image.的类
  2. 创建一个RoutedEvent,以方便鼠标单击事件。
  3. 覆盖OnMouseLeftButtonDown

在我的示例中,我计算单击计数,因为不知道如何做得更好。

代码语言:javascript
复制
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:

代码语言:javascript
复制
<local:ImageHelper>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonClickEvent">
                    <i:InvokeCommandAction Command="{Binding Path=MyCommand}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
 </local:ImageHelper>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19796221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档