Я построить представление в 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;
}
но это Безразлично Не работай.
Хорошо, но на объекте ведьмы: SV (ScrollViewer) или ScheduleView (Canvas)? Я добавил код, что я пробовал. – Rayet