我目前正在将应用程序从iPhone移植到Windows Phone。
两个平台之间按钮的行为完全不同。
特别是,在iPhone上,可以按下按钮并释放按钮区域外的按钮。 iOS有两个处理此事件的事件:Touch Up Inside和Touch Up Outside
在Windows Phone和Silverlight上,行为是不同的,遗憾的是不是我想要的。
您可以在单击按钮时调用Click方法,无论是在实际单击按钮时还是在其被释放时;这种方式或其他方式(通过ClickMode值控制的行为)
如果按下按钮并在手指没有精确按下按钮时将其释放,则不会发生任何事件(尽管按钮状态会因外观变化而改变)
最终,我想要实现的是能够在释放按钮时触发事件,并且当手指在任何一种情况下释放时都会发生该事件,就像在iPhone上一样。 例如: 按下按钮,将手指移到按钮外,松开手指 - >事件触发 问题是检测手指离开屏幕的时间,而不是当它离开按钮时(可以通过OsIsPressedChangeed轻松检测到)
任何想法都会受到高度赞赏
答案 0 :(得分:0)
以下是我最好能够模拟类似行为的方法(即使手指停在按钮顶部时也会生成按键释放事件)
public class CalcButton : Button
{
public delegate void CalcButtonHandler(object sender);
public event CalcButtonHandler Pressed;
public event CalcButtonHandler Released;
private bool hasFocus = false;
private bool _isPressed = false;
private bool isPressed
{
set
{
if (value != _isPressed)
{
_isPressed = value;
Debug.WriteLine(Name + (_isPressed ? " Button Is Pressed" : " Button Is Released"));
if (_isPressed)
{
// custom default press action
// here
if (Pressed != null)
{
Pressed(this);
}
}
else
{
if (Released != null)
{
Released(this);
}
}
}
}
get
{
return _isPressed;
}
}
protected override void OnIsPressedChanged(DependencyPropertyChangedEventArgs e)
{
Debug.WriteLine(Name + " is pressed change");
if (hasFocus && !base.IsPressed)
{
isPressed = false;
}
else if (base.IsPressed)
{
isPressed = true;
}
base.OnIsPressedChanged(e);
}
protected override void OnLostFocus(RoutedEventArgs e)
{
hasFocus = false;
_isPressed = false; // do not trigger key release event
Debug.WriteLine(Name + " lost focus");
base.OnLostFocus(e);
}
protected override void OnGotFocus(RoutedEventArgs e)
{
hasFocus = true;
Debug.WriteLine(Name + " got focus");
base.OnGotFocus(e);
}
protected override void OnHold(GestureEventArgs e)
{
_isPressed = false; // do not trigger key release event
Debug.WriteLine(Name + " on hold");
base.OnHold(e);
}
}
还有一个小问题;如果您按一个按钮,按住它,按另一个按钮,即使仍按下按钮,也会为第一个按钮生成已发布的事件。不知道如何解决这个问题
答案 1 :(得分:0)
也许您可以尝试捕捉触摸输入。它似乎不适用于按钮 - 也许它在内部做它,但也许你可以实现自己的按钮来做到这一点。 使用矩形:
XAML:
<Rectangle
x:Name="rectangle"
Fill="Yellow"
VerticalAlignment="Bottom"
HorizontalAlignment="Stretch"
Height="200"
MouseLeftButtonDown="Rectangle_MouseLeftButtonDown"
MouseLeftButtonUp="Rectangle_MouseLeftButtonUp"/>
代码背后:
private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var success = rectangle.CaptureMouse();
}
private void Rectangle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
rectangle.ReleaseMouseCapture();
Point p = e.GetPosition(rectangle);
if (new Rect(0, 0, rectangle.ActualWidth, rectangle.ActualHeight)
.Contains(p))
{
Debug.WriteLine("Mouse up inside rectangle.");
}
else
{
Debug.WriteLine("Mouse up outside rectangle.");
}
}