Как сделать перетаскивание объекта Ellipse накопительным? - PullRequest
0 голосов
/ 17 марта 2012

Я следую учебному пособию и определил (в файле XAML) объект Ellipse, расположенный в центре экрана и содержащий узел TranslateTransform в узле Ellipse.RenderTransform, следующим образом:

<Ellipse
  x:Name="theEllipse"
  Fill="White"
  Width="200"
  Height="200">
  <Ellipse.RenderTransform>
    <TranslateTransform x:Name="theMover" />
  </Ellipse.RenderTransform>
</Ellipse>

В коде позади я добавил обработчик событий ManipulationDelta к Ellipse следующим образом:

public MainPage()
{
// other stuff
theEllipse.ManipulationDelta
  += new EventHandler<ManipulationDeltaEventArgs>(theEllipse_ManipulationDelta);
}

void theEllipse_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
{
theMover.X = e.CumulativeManipulation.Translation.X;
theMover.Y = e.CumulativeManipulation.Translation.Y;
}

Таким образом я могу нажать на Ellipse и перетащить его из начальной позиции. Однако я обнаружил, что когда я отпускаю Ellipse и нажимаю на него во второй раз, Ellipse прыгает и начинает перетаскивать из своей начальной позиции, а не из текущей позиции. Почему это? И как бы я определил мое перетаскивающее действие как кумулятивное в том смысле, что когда я перетаскиваю Эллипс во второй раз, он содержит откуда угодно?

1 Ответ

0 голосов
/ 09 января 2013

Не уверен, если у вас есть это исправлено или нет, но вот решение этого вопроса:

Добавьте обработчик события для манипуляцииStarting и задайте манипуляторContainer как его мать.

<Window x:Class="TempProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="768" Width="640"
    ManipulationStarting="window_ManipulationStarting"
      ManipulationDelta="window_ManipulationDelta"
     >
<Grid x:Name="canvas">
    <Ellipse
x:Name="theEllipse"
Fill="Black"
Width="200"
Height="200"
IsManipulationEnabled="True">
<Ellipse.RenderTransform>
            <TranslateTransform x:Name="theMover" />
        </Ellipse.RenderTransform>
    </Ellipse>
</Grid>
</Window>

Функция должна быть такой:

private void window_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        theMover.X = e.CumulativeManipulation.Translation.X;
        theMover.Y = e.CumulativeManipulation.Translation.Y;
        e.Handled = true;
    }

    private void window_ManipulationStarting(object sender, ManipulationStartingEventArgs e)
    {
        e.ManipulationContainer = canvas;
        e.Handled = true;
    }

где "canvas" - это имя моего макета сетки, содержащего эллипс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...