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

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

现在想用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里很好的实现么?



...全文
22 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复

476

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧