[英]WP7: Suppressing XNA touch input when handled by Silverlight?
我在Mango中有一個XNA + Silverlight游戲:主要是XNA,頂部有一些Silverlight UI。 我遇到的問題是當你點擊按鈕或與Silverlight控件交互時,觸摸信息仍會傳遞給XNA游戲循環。 你怎么壓抑這個?
寫了一堂課為我做跟蹤。 頁面加載后(在Loaded處理程序中),創建它並為其提供根元素(因此它可以附加到LayoutUpdated事件)。 注冊在游戲過程中可能覆蓋游戲表面的任何控件。 然后只需調用TouchesControl並傳遞觸摸位置,以確定是否應該忽略該點。 它會緩存控件的區域,並在布局更新時更新它們。
應該適用於矩形元素移動,改變大小或折疊/擴展。
public class ControlTouchTracker
{
private List<FrameworkElement> controls = new List<FrameworkElement>();
private Dictionary<FrameworkElement, ControlRegion> controlBounds = new Dictionary<FrameworkElement, ControlRegion>();
public ControlTouchTracker(FrameworkElement rootElement)
{
rootElement.LayoutUpdated += this.OnLayoutUpdated;
}
public void RegisterControl(FrameworkElement control)
{
controls.Add(control);
}
public void RemoveControl(FrameworkElement control)
{
controls.Remove(control);
controlBounds.Remove(control);
}
private void OnLayoutUpdated(object sender, EventArgs e)
{
foreach (Control control in this.controls)
{
this.RefreshControlBounds(control);
}
}
private void RefreshControlBounds(FrameworkElement control)
{
if (this.ControlIsVisible(control))
{
try
{
GeneralTransform controlTransform = control.TransformToVisual(Application.Current.RootVisual);
Point offset = controlTransform.Transform(new Point(0, 0));
this.controlBounds[control] = new ControlRegion
{
Left = (float)offset.X,
Right = (float)(offset.X + control.ActualWidth),
Top = (float)offset.Y,
Bottom = (float)(offset.Y + control.ActualHeight)
};
}
catch (ArgumentException)
{
}
}
else
{
if (this.controlBounds.ContainsKey(control))
{
this.controlBounds.Remove(control);
}
}
}
private bool ControlIsVisible(FrameworkElement control)
{
// End case
if (control == null)
{
return true;
}
if (control.Visibility == Visibility.Collapsed)
{
return false;
}
return this.ControlIsVisible(control.Parent as FrameworkElement);
}
public bool TouchesControl(Vector2 touchPosition)
{
foreach (ControlRegion region in this.controlBounds.Values)
{
if (touchPosition.X >= region.Left && touchPosition.X <= region.Right &&
touchPosition.Y >= region.Top && touchPosition.Y <= region.Bottom)
{
return true;
}
}
return false;
}
public class ControlRegion
{
public float Left { get; set; }
public float Right { get; set; }
public float Top { get; set; }
public float Bottom { get; set; }
}
}
(編輯)更新了使用父元素更改Visibility
示例。
由於與XNA互操作的方式,您將始終獲得由XNA和Silverlight處理的觸摸輸入 - 在某種程度上,XNA獲得優先級,因此Silverlight就是最重要的。 您可以做什么,如果您需要忽略特定的手勢位置(例如Silverlight按鈕所在的位置),您可以檢查手勢位置:
if (TouchPanel.IsGestureAvailable)
{
if (TouchPanel.ReadGesture().GestureType == GestureType.Tap)
{
if (TouchPanel.ReadGesture().Position == new Vector2(120, 120))
{
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.