在Windows Phone 7中,ManipulationDelta事件无法按预期工作

时间:2011-06-20 23:59:15

标签: .net events windows-phone-7 touch

这是重现它的代码,xaml:

<phone:PhoneApplicationPage 
    x:Class="WindowsPhoneApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Canvas x:Name="LayoutRoot" Background="Gray" Width="600" Height="800">
        <!--ContentPanel - place additional content here-->
        <Rectangle Name="rectangle" Width="100" Height="100" Fill="Red" />
    </Canvas>
</phone:PhoneApplicationPage>

这是代码隐藏的代码:

public partial class MainPage : PhoneApplicationPage
    {
        private double translationX = 0.0;
        private double translationY = 0.0;

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            LayoutRoot.ManipulationDelta += this.PhoneApplicationPage_ManipulationDelta;
        }

        void PhoneApplicationPage_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
        {
            this.translationX += e.DeltaManipulation.Translation.X;
            this.translationY += e.DeltaManipulation.Translation.Y;

            System.Diagnostics.Debug.WriteLine(string.Format("{0},{1}", this.translationX, this.translationY));

            var c = new Rectangle();
            //var c = rectangle;
            c.Width = 100;
            c.Height = 100;
            c.Fill = new SolidColorBrush(Colors.Red);
            c.SetValue(Canvas.LeftProperty, this.translationX);
            c.SetValue(Canvas.TopProperty, this.translationY);

            LayoutRoot.Children.Clear();
            LayoutRoot.Children.Add(c);
        }

    }

运行此应用程序,拖动红色矩形,您会发现矩形只移动一次,它不会跟随手指(或鼠标指针)的移动。

现在尝试更改以下两行代码:

var c = new Rectangle();
//var c = rectangle;

到这种形式:

//var c = new Rectangle();
var c = rectangle;

然后再次运行它,它会按预期工作,矩形将跟随你的发现者(或鼠标指针)的移动,为什么会这样?

由于

2 个答案:

答案 0 :(得分:0)

代码的第一个版本是创建一个新的矩形实例 第二个移动你在XAML中创建的那个。

答案 1 :(得分:0)

这有助于理解它。使用创建Rectangle新实例的版本,单击Rectangle外部并在屏幕上拖动。有用。现在在xaml中,为Rectangle设置IsHitTestVisible =“False”。现在单击矩形内部并拖动,它也可以工作。很明显,Rectangle可以拦截一些操作事件而不是将它们转发到LayoutRoot,你需要为此做一些调整。

Richard Woo

============ 这是来自App Hub