silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了WP7:在Silverlight处理时抑制XNA触摸输入?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在Mango中有一个XNA Silverlight游戏:主要是XNA,顶部有一些Silverlight UI.我遇到的问题是当你点击按钮或与Silverlight控件交互时,触摸信息仍会传递给XNA游戏循环.你怎么压抑这个? 写了一堂课为我做跟踪.页面加载后(在Loaded处理程序中),创建它并为其提供根元素(因此它可以附加到Layoutupdated事件).注册在游戏过程中可能覆盖游戏表面的任
我在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; }
    }
}

(编辑)更新了使用父元素更改可见性的示例.

大佬总结

以上是大佬教程为你收集整理的WP7:在Silverlight处理时抑制XNA触摸输入?全部内容,希望文章能够帮你解决WP7:在Silverlight处理时抑制XNA触摸输入?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。