В Windows Phone 7 событие ManipulationDelta не работает должным образом - PullRequest
0 голосов
/ 21 июня 2011

Это код для его воспроизведения, 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 голосов
/ 22 июня 2011

Вот кое-что, что поможет понять это.Используя вашу версию, которая создает новые экземпляры Rectangle, щелкните за пределами Rectangle и перетащите по экрану.Оно работает.Теперь в xaml установите IsHitTestVisible = "False" для прямоугольника.Теперь нажмите внутри прямоугольника и перетащите, и это тоже работает.Понятно, что Rectangle может перехватывать некоторые манипуляционные события и не перенаправлять их в LayoutRoot, и вам нужно сделать что-то для этого.===== Это из App Hub

0 голосов
/ 21 июня 2011

Первая версия кода создает новый экземпляр прямоугольника.
Второй перемещает тот, который вы создали в XAML.

...