如何模拟物理现实世界中的一种按钮?
物理世界中有一个设备,设备接到向左移动的指令后会一直向左移动,直到收到停止移动的命令后,设备才停止移动。
然后物理世界中有一个按钮,当按钮按下的时候,给设备发送向左移动的命令,按钮抬起时给设备发送停止移动命令。如此一来,按一下按钮马上抬起,则设备动一下马上停止;长按按钮,设备一直向左移动直到按钮抬起。
现在想用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里很好的实现么?