2011-08-01 4 views
0

私はWPFの初心者です。私は、マウス(drag'n'dropスタイル)で移動可能なグリッドを持つフルスクリーンのアプリケーションを実装しました。グリッドコントロールが画面境界から後退した場合、単純なアニメーションでデフォルト状態に戻ります。問題は、グリッドがそれ以上移動できない場合です。提供されるいくつかのコードスニペット:操作デリータとアニメーション

public partial class MenuCard : UserControl, ITouchObject, INotifyPropertyChanged 
{ 
    ... 
    public static readonly DependencyProperty XProperty = 
     DependencyProperty.Register("X", typeof(double), typeof(MenuCard), new UIPropertyMetadata(0.0, OnPosXChanged, CourceXValue)); 
    ... 
    private static void OnPosXChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var owner = (MenuCard) d; 
     Grid rootGrid = (Grid)Application.Current.MainWindow.FindName("rootGrid"); 
     Point actual = owner.TransformToAncestor(rootGrid).Transform(new Point(owner.X, owner.Y)); 
     Point topLeft = owner.TransformToAncestor(rootGrid).Transform(new Point(0, 0)); 
     Point bottomRight = owner.TransformToAncestor(rootGrid).Transform(new Point(owner.ActualWidth, owner.ActualHeight)); 

     if (actual.X + (bottomRight.X - topLeft.X) <= border || actual.X >= SystemParameters.PrimaryScreenWidth - border) 
     { 
      ReturnToDefault(owner); 
     } 
    } 
    ... 
    private static void ReturnToDefault(MenuCard owner) 
    { 
     DoubleAnimation yAnimation = new DoubleAnimation(); 
     yAnimation.From = owner.Y; 
     yAnimation.DecelerationRatio = 0.5; 
     yAnimation.To = (double)YProperty.DefaultMetadata.DefaultValue; 
     owner.BeginAnimation(MenuCard.YProperty, yAnimation); 

     DoubleAnimation xAnimation = new DoubleAnimation(); 
     xAnimation.From = owner.X; 
     xAnimation.DecelerationRatio = 0.5; 
     xAnimation.To = (double)XProperty.DefaultMetadata.DefaultValue; 
     owner.BeginAnimation(MenuCard.XProperty, xAnimation); 
    } 
} 

メインクラスは:

public partial class MainWindow : Window 
{ 

    private void CanvasManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
     var p = GetSender(e.ManipulationContainer as FrameworkElement);  
     if (p != null) 
     { 
      ManipulationDelta md = e.DeltaManipulation; 
      p.X += md.Translation.X; 
      p.Y += md.Translation.Y; 
      p.Angle += md.Rotation; 
      p.ScaleX *= md.Scale.X; 
      p.ScaleY *= md.Scale.Y; 
     } 
     e.Handled = true; 
    } 

    private ITouchObject GetSender(FrameworkElement element) 
    { 
     while (true) 
     { 
      if (element.Parent == null) 
      { 
       return null; 
      } 
      if (element is ITouchObject) 
      { 
       return element as ITouchObject; 
      } 
      element = element.Parent as FrameworkElement; 
     } 
    } 
} 

私はアイデアを持っていません。どんな助けもありがとう!

答えて

0

xAnimation.FillBehavior = FillBehavior.Stop ...すべてのアニメーションにFillBehaviorプロパティを追加してください。これはあなたにそれがアニメーションの前にある同じ位置に戻って撮影したグリッドを生じる可能性が

...

あなたがアニメーションの終わりにこれを扱うことができ、手動でプロパティを設定することが

..

いくつかのことここでは、この

ようにあなたは

yAnimation.To =(ダブル)YProperty.DefaultMetadata.DefaultValue ...アニメーションに値に与えています。あなたが直接、同じ値を設定し、アニメーションの終わりに

...

MenuCard.YProperty =(ダブル)YProperty.DefaultMetadata.DefaultValue。

関連する問題