2014-01-30 2 views
0

Я построить представление в Windows Phone 7.1 с холстами и ScrollViewer:Прямоугольник следовать пальцем на холсте в Scrollview

<Grid x:Name="LayoutRoot"> 
    <ScrollViewer x:Name="SV" Margin="0,8,0,-8" ManipulationCompleted="ScheduleBackground_ManipulationCompleted" Hold="SV_Hold"> 
     <Canvas x:Name="ScheduleView" Grid.Row="1" Margin="0,0" Height="1560" Loaded="ScheduleView_Loaded" > 
     <Canvas x:Name="ScheduleBackground" > 
       <Grid x:Name="HoursLegend" /> 
      </Canvas> 
     </Canvas> 
    </ScrollViewer> 
</Grid> 

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

// in page behind 
    private TaskCreator taskCreator; 

    private void SV_Hold(object sender, GestureEventArgs e) 
    { 

     taskCreator = new TaskCreator(ScheduleView, e); 
    } 

    private void ScheduleBackground_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) 
    { 
     if (taskCreator != null) 
     { 
      taskCreator.Clear(); 
      taskCreator = null; 
     } 
    } 

Мой класс для хранения прямоугольник:

class TaskCreator 
{ 
    private System.Windows.Controls.Canvas ScheduleView; 
    private System.Windows.Input.GestureEventArgs e; 
    private Rectangle rec; 

    public TaskCreator(System.Windows.Controls.Canvas ScheduleView, System.Windows.Input.GestureEventArgs e) 
    { 
     this.ScheduleView = ScheduleView; 
     this.e = e; 

     CreateTask(); 
    } 

    private void CreateTask() 
    { 
     if (rec != null) throw new InvalidOperationException("Cannot create task without clear the previous rectangle"); 

     rec = new Rectangle(); 
     SolidColorBrush brush = new SolidColorBrush(Colors.Red); 
     rec.Stroke = brush; 
     rec.Fill = brush; 

     rec.Width = this.ScheduleView.ActualWidth; 
     rec.Height = 45; 

     Point pos = e.GetPosition(this.ScheduleView); 
     rec.Margin = new Thickness(0, pos.Y, 0, 0); 

     this.ScheduleView.Children.Add(rec); 
    } 

    public void Clear() 
    { 
     if (rec != null && ScheduleView != null) 
     { 
      this.ScheduleView.Children.Remove(rec); 
      rec = null; 
     } 
    } 
    } 

И это тоже работает. Когда пользователь держит палец на прямоугольнике холста, после того, как он отвлечет палец, исчезнет прямоугольник.

Теперь я хотел бы переместить этот прямоугольник, когда пользователь перемещает палец (но все еще удерживает его). Как я могу это сделать? Какое событие я должен использовать? С моей точки зрения, самая большая проблема здесь - ScrollViewer. После рисования прямоугольника SV все еще работает (что хорошо), но когда я плаваю SV, движется, и мой прямоугольник всегда находится в том же положении (относительно холста).

То, что я уже пробовал:

Я добавил ManipulationDelta = "SV_ManipulationDelta" в SV:

private void SV_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
     if (taskCreator != null) 
      taskCreator.Move(e); 
    } 

и в классе:

private TranslateTransform dragTranslation = new TranslateTransform(); 
    internal void Move(System.Windows.Input.ManipulationDeltaEventArgs e) 
    { 
     dragTranslation.Y += e.DeltaManipulation.Translation.Y; 
     rec.RenderTransform = dragTranslation; 
    } 

но это Безразлично Не работай.

ответ

0

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

private void ManipulationDelta(object sender,System.Windows.Input.ManipulationDeltaEventArgs e) 
    {} 

Из этого вы можете обновить положение прямоугольника.

Стоит отметить, что это событие не всегда срабатывает на эмуляторе, но отлично работает на устройстве.

+0

Хорошо, но на объекте ведьмы: SV (ScrollViewer) или ScheduleView (Canvas)? Я добавил код, что я пробовал. – Rayet

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