2015-01-25 1 views
0

Я пытаюсь переместить объект в соответствии с кнопками направления Вверх, Влево, Вправо, Вниз.Перемещение объекта в соответствии с кнопкой направления в WP8 App

Я устанавливаю свойство маржи, как: -

img.Margin = new Thickness(l, t, r, b); //L T R B 

Я инкрементацию/декремент значения в зависимости от желаемого движения необходимо.

Я могу перемещать объект через событие click. Тем не менее, я хотел бы переместить объект в нужном направлении всякий раз, когда кнопка нажата и удерживается для пользователя. Как только пользователь отпускает кнопку, движение также должно остановиться.

Я попытался использовать событие hold, но операция была выполнена один раз, а затем остановлена.

С другой попытки я попытался зациклиться на своих заявлениях, но приложение заглох.

Просьба помочь мне. Благодаря!

EDIT: -

Я обработал ManipulationStarted, ManipulationDelta, ManipulationCompleted события.

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

Код для кнопки Up (кнопка, которая перемещает объект в вертикальном направлении) является: -

public double l = 0.0, t = 0.0, r = 0.0, b = 0.0; 
    public void move() 
    { 
     img.Margin = new Thickness(l, t, r, b); //L T R B 
    } 

    private void up_ManipulationStarted(object sender, ManipulationStartedEventArgs e) 
    { 

    } 

    private void up_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
     t = t + 1.0; 
     move(); 
    } 

    private void up_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) 
    { 

    } 

Я не уверен, является ли правильным или нет этот метод. Посоветуйте. Благодарю.

ответ

0

Вы должны использовать ManipulationStarted и ManipulationCompleted события. Они работают Tap и Hold жестов, как указано здесь: https://msdn.microsoft.com/en-us/library/windows/apps/ff426933(v=vs.105).aspx

Update

Чтобы правильно определить начало и конец крана, я предлагаю использовать MouseEnter и MouseLeaving события. Здесь образец, который показывает, как я перемещаюсь по объекту. Это в настоящее время квадрат в центре экрана:

<Grid x:Name="objectToMove" Background="red" Height="100" Width="100"> 
    <Grid.RenderTransform> 
     <TranslateTransform x:Name="verticalTransform" Y="0" /> 
    </Grid.RenderTransform> 
</Grid> 

Код позади:

AutoResetEvent autoEvent = new AutoResetEvent(true); 

System.Threading.Timer dt; 

private void toggle_MouseEnter(object sender, MouseEventArgs e) 
{ 
    dt = new System.Threading.Timer(new TimerCallback(MoveFunct), autoEvent, 0, 1); 
} 

private void MoveFunct(Object stateInfo) 
{ 
    Deployment.Current.Dispatcher.BeginInvoke(() => { verticalTransform.Y += 3; }); 
} 

private void toggle_MouseLeave(object sender, MouseEventArgs e) 
{ 
    dt.Dispose(); 
} 

Обратите внимание, что последний параметр Timer конструктора состоит в интервале между клещами. Также внутри функции MoveFunct я вызываю метод Dispatcher, иначе он не смог получить доступ к потоку пользовательского интерфейса. В образце я использовал TranslateTransform, который лучше, на мой взгляд, чем Margin манипуляции, потому что для этого требуется обновить элемент всего визуального дерева.

+0

Решение, которое вы опубликовали, частично решает проблему. Я хочу, чтобы объект перемещался, когда я удерживаю кнопку «Вверх»/«Вниз»/«Влево»/«Вправо» и «** не сам объект». ** –

+0

С таким же подходом это должно быть возможно. Я напишу код, иначе я прошу прощения за бесполезный ответ – fillobotto

+0

@AnmolKumar См. Ответ, это работает на меня – fillobotto

Смежные вопросы