none
如何模拟物理现实世界中的一种按钮? RRS feed

  • 问题

  • 物理世界中有一个设备,设备接到向左移动的指令后会一直向左移动,直到收到停止移动的命令后,设备才停止移动。
    然后物理世界中有一个按钮,当按钮按下的时候,给设备发送向左移动的命令,按钮抬起时给设备发送停止移动命令。如此一来,按一下按钮马上抬起,则设备动一下马上停止;长按按钮,设备一直向左移动直到按钮抬起。

    现在想用WPF中的控件来模拟现实中的这个按钮。可是我找不到合适的控件。因为找不到一个控件(不利用MouseDown或者MouseLeave这两个事件)按下时触发一个事件,抬起时触发一个事件。我的问题如下:

    1.如果wpf中有类似的控件,希望能告诉我,非常感谢。

    2.如果wpf中没有类似控件,我用textblock简单来拟了一个这个控件,可是有一些东西想不通,希望有能帮助解答的人。

    xaml中

    <TextBlock Width="100" Height="61.8" Text="测试" Background="LightCoral"

    MouseLeftButtonDown="UIElement_OnMouseLeftButtonDown"

    MouseLeftButtonUp="UIElement_OnMouseLeftButtonUp"/>

    cs中

    在cs中加入的CaptureMouse()能避免,在TextBlock上按下了鼠标左键,不松手,滑出TextBlock时,收不到MouseLeftButtonUp事件的问题,也能避免在TextBlock外按住鼠标左键不松手,然后滑动到TextBlock上松手,只能触发MouseLeftButtonUp,而不会触发MouseLeftButtonDown的问题

            private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                TextBlock txtBlock = sender as TextBlock;
                txtBlock.CaptureMouse();
                ResultTbk.Text += "按钮被按下了" + DateTime.Now.ToLocalTime().ToString("yyyy-M-d dddd HH:mm:ss:fff") + "\r\n";
            }
    
            private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                TextBlock txtBlock = sender as TextBlock;
    
                if (txtBlock.IsMouseCaptured)
                {
                    txtBlock.ReleaseMouseCapture();
                    ResultTbk.Text += "按钮被抬起了" + DateTime.Now.ToLocalTime().ToString("yyyy-M-d dddd HH:mm:ss:fff") + "\r\n";
                }
            }

    但是问题来了,我用mvvmlight框架时,xaml中应该使用绑定,使用命令绑定到事件,能够在viewmodel响应MouseLeftButtonDown和MouseLeftButtonUp事件,可是我在响应事件时还能如何利用上面的CaptureMouse(),IsMouseCaptured,和ReleaseMouseCapture()
    这些特性来解决最开始说的问题呢?此外使用TextBlock控件来模拟这种按钮的话,我还需要设计这个按钮的按下状态的外观,抬起状态的外观,这些还能在xaml里很好的实现么?



    • 已编辑 Jason Yuan 2016年9月6日 12:52 修改用词
    2016年9月6日 12:26

答案

  • 自定义控件
    2016年9月7日 7:03
  • 您好 Jason,

    同意上面回复者的观点,我们可以通过自定义控件来实现你的需求。我们可以在控件里定义两个Command用来和ViewModel做绑定。把OnMouseLeftButtonDown和OnMouseLeftButtonUp全部实现在控件内部。以下代码供你参考。

    public class MyCustomControl : Control
    {
        public static DependencyProperty PressCommandProperty
            = DependencyProperty.Register(
                "PressCommand",
                typeof(ICommand),
                typeof(MyCustomControl));
    
        public static DependencyProperty ReleaseCommandProperty
            = DependencyProperty.Register(
                "ReleaseCommand",
                typeof(ICommand),
                typeof(MyCustomControl));
    
        public ICommand PressCommand
        {
            get
            {
                return (ICommand)GetValue(PressCommandProperty);
            }
    
            set
            {
                SetValue(PressCommandProperty, value);
            }
        }
    
        public ICommand ReleaseCommand
        {
            get
            {
                return (ICommand)GetValue(ReleaseCommandProperty);
            }
    
            set
            {
                SetValue(ReleaseCommandProperty, value);
            }
        }
    
        private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            TextBlock txtBlock = sender as TextBlock;
            txtBlock.CaptureMouse();
            PressCommand.Execute(sender);
        }
    
        private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            TextBlock txtBlock = sender as TextBlock;
    
            if (txtBlock.IsMouseCaptured)
            {
                txtBlock.ReleaseMouseCapture();
                ReleaseCommand.Execute(sender);
            }
        }
    }

    >>"我还需要设计这个按钮的按下状态的外观,抬起状态的外观,这些还能在xaml里很好的实现么?"

    对于这一点,我们需要在按钮按下事件后动态的修改按钮的Style.这个也需要在自定义控件中去实现。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年9月8日 2:42

全部回复

  • 自定义控件
    2016年9月7日 7:03
  • 您好 Jason,

    同意上面回复者的观点,我们可以通过自定义控件来实现你的需求。我们可以在控件里定义两个Command用来和ViewModel做绑定。把OnMouseLeftButtonDown和OnMouseLeftButtonUp全部实现在控件内部。以下代码供你参考。

    public class MyCustomControl : Control
    {
        public static DependencyProperty PressCommandProperty
            = DependencyProperty.Register(
                "PressCommand",
                typeof(ICommand),
                typeof(MyCustomControl));
    
        public static DependencyProperty ReleaseCommandProperty
            = DependencyProperty.Register(
                "ReleaseCommand",
                typeof(ICommand),
                typeof(MyCustomControl));
    
        public ICommand PressCommand
        {
            get
            {
                return (ICommand)GetValue(PressCommandProperty);
            }
    
            set
            {
                SetValue(PressCommandProperty, value);
            }
        }
    
        public ICommand ReleaseCommand
        {
            get
            {
                return (ICommand)GetValue(ReleaseCommandProperty);
            }
    
            set
            {
                SetValue(ReleaseCommandProperty, value);
            }
        }
    
        private void UIElement_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            TextBlock txtBlock = sender as TextBlock;
            txtBlock.CaptureMouse();
            PressCommand.Execute(sender);
        }
    
        private void UIElement_OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            TextBlock txtBlock = sender as TextBlock;
    
            if (txtBlock.IsMouseCaptured)
            {
                txtBlock.ReleaseMouseCapture();
                ReleaseCommand.Execute(sender);
            }
        }
    }

    >>"我还需要设计这个按钮的按下状态的外观,抬起状态的外观,这些还能在xaml里很好的实现么?"

    对于这一点,我们需要在按钮按下事件后动态的修改按钮的Style.这个也需要在自定义控件中去实现。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年9月8日 2:42