2013-05-21 18 views
15

のグリッドにDragStartedDragDeltaイベントをどのように添付できますか。私はGestureService.GetGestureListener()メソッドでWindowsの電話で同じをやった。私は、コードをWindowsのManipulationStarted & ManipulationDeltaイベントに置き換えようとしましたが、結果は同じではありません。 1回のドラッグでWindows PhoneでDragDeltaイベントを2回以上入力します。しかし、一方でWindows 8では、ManupulationDeltaイベントでは、同じようなドラッグ操作のために1回だけ起動します。WindowsでのDragStarted DragDeltaイベントの実装8/WinRT

+0

グリッドに 'IsManipulationEnabled = true'を設定しましたか? –

+0

グリッドへのそのようなプロパティは見つかりませんでした。私はプロパティを設定しますManipulationMode = "All" –

+0

申し訳ありません - 私はWPFグリッドと混乱しています - あなたが言ったように、 'Windows.UI.Xaml.Controls.Grid'は' ManipulationMode'によって操作が有効になっています。 –

答えて

10

ええ、私はあなたが望むものを知っていると思います。

は、あなたがこのようないくつかのXAMLを持っているとしましょう:

<Grid Margin="50"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Rectangle Fill="Blue" x:Name="MyRect" /> 
</Grid> 

あなたはそれをドラッグしてGridの周りにその四角形を移動したいです。このため

public MainPage() 
{ 
    this.InitializeComponent(); 
    MyRect.ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY; 
    MyRect.ManipulationDelta += Rectangle_ManipulationDelta; 
    MyRect.ManipulationCompleted += Rectangle_ManipulationCompleted; 
} 

private void Rectangle_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 
{ 
    var _Rectangle = sender as Windows.UI.Xaml.Shapes.Rectangle; 
    var _Transform = (_Rectangle.RenderTransform = (_Rectangle.RenderTransform as TranslateTransform) ?? new TranslateTransform()) as TranslateTransform; 
    _Transform.X += e.Delta.Translation.X; 
    _Transform.Y += e.Delta.Translation.Y; 
} 

private void Rectangle_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) 
{ 
    var _Rectangle = sender as Windows.UI.Xaml.Shapes.Rectangle; 
    _Rectangle.RenderTransform = null; 

    var _Column = System.Convert.ToInt16(_Rectangle.GetValue(Grid.ColumnProperty)); 
    if (_Column <= 0 && e.Cumulative.Translation.X > _Rectangle.RenderSize.Width * .5) 
     _Rectangle.SetValue(Grid.ColumnProperty, 1); 
    else if (_Column == 1 && e.Cumulative.Translation.X < _Rectangle.RenderSize.Width * -.5) 
     _Rectangle.SetValue(Grid.ColumnProperty, 0); 

    var _Row = System.Convert.ToInt16(_Rectangle.GetValue(Grid.RowProperty)); 
    if (_Row <= 0 && e.Cumulative.Translation.Y > _Rectangle.RenderSize.Height * .5) 
     _Rectangle.SetValue(Grid.RowProperty, 1); 
    else if (_Row == 1 && e.Cumulative.Translation.Y < _Rectangle.RenderSize.Height * -.5) 
     _Rectangle.SetValue(Grid.RowProperty, 0); 
} 

ただ、このコードを使用し

enter image description here

は、私は近いよ願っています! 運が良かった!

+0

Thxこの素晴らしいコードを投稿してください。それは私の仕事で私を助けました!しかし、私はこれがどのように動作しているのか、そしてメインページのコンストラクタで2つの操作モード(xとy)を使用しているのかどうか分かりません。コードをステップごとに説明できますか?大いに感謝する!実際に何が起こっているのか理解しようとしています。 :) –

+0

GridViewの外にドラッグアンドドロップすると素敵な部分。面白いのは、少なくともManipulationMode = "All"に設定しているときは、スライドしてリリースするときに動き続けることです –

関連する問題