0

Sticky WPF ウィンドウを作成しようとしています。

ウィンドウが左に近い場合は左にスティック、右に近い場合は右にスティック、そうでない場合は上にスティック

私が使用しているコードの下に、

private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                this.DragMove();
            }

    private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {                
                Point currentPoints = PointToScreen(Mouse.GetPosition(this));

//Place left
                if (currentPoints.X < (300))
                {                 
                    DoubleAnimation moveAnimation = new DoubleAnimation(-190, TimeSpan.FromSeconds(1));
                    _MyWindow.BeginAnimation(Window.LeftProperty, moveAnimation);
                }
//Place Right
                else if (currentPoints.X > (Screen.PrimaryScreen.WorkingArea.Width - 300))
                {
                    DoubleAnimation moveAnimation = new DoubleAnimation(Screen.PrimaryScreen.WorkingArea.Width + 190, TimeSpan.FromSeconds(1));
                    _MyWindow.BeginAnimation(Window.LeftProperty, moveAnimation);              
                }
//Place top
                else
                {
                    DoubleAnimation TopAnimation = new DoubleAnimation(-190, TimeSpan.FromSeconds(1));
                    _MyWindow.BeginAnimation(Window.TopProperty, TopAnimation, HandoffBehavior.Compose);
                }
            }

上記のコードは、ウィンドウを 1 回だけ移動します。

MSDN の「方法: ストーリーボードでアニメーション化した後にプロパティを設定する」

アニメーションを再度実行するには、BeginAnimation プロパティを NULL に設定します。

アニメーションの前にプロパティを NULL に設定してみました。そして、コードは正常に動作するようになりました。

コードは次のようになります

private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Point currentPoints = PointToScreen(Mouse.GetPosition(this));

            if (currentPoints.X < (300))
            {
                if (_MyWindow.HasAnimatedProperties)
                    _MyWindow.BeginAnimation(Window.LeftProperty, null);
                DoubleAnimation moveAnimation = new DoubleAnimation(-190, TimeSpan.FromSeconds(1));
                _MyWindow.BeginAnimation(Window.LeftProperty, moveAnimation);
            }
            else if (currentPoints.X > (Screen.PrimaryScreen.WorkingArea.Width - 300))
            {
                if (_MyWindow.HasAnimatedProperties)
                    _MyWindow.BeginAnimation(Window.LeftProperty, null);
                DoubleAnimation moveAnimation = new DoubleAnimation(Screen.PrimaryScreen.WorkingArea.Width + 190, TimeSpan.FromSeconds(1));
                _MyWindow.BeginAnimation(Window.LeftProperty, moveAnimation);
            }
            else
            {
                if (_MyWindow.HasAnimatedProperties)
                    _MyWindow.BeginAnimation(Window.TopProperty, null);
                DoubleAnimation TopAnimation = new DoubleAnimation(-190, TimeSpan.FromSeconds(1));
                _MyWindow.BeginAnimation(Window.TopProperty, TopAnimation, HandoffBehavior.Compose);
            }
        }

気づいたら、ウィンドウを左と上に-190の位置に配置して、その一部を非表示にしています。

しかし、Belowプロパティを使用すると、ウィンドウの位置が0にリセットされます。位置をリセットしたくありません

_MyWindow.BeginAnimation(Window.LeftProperty, null);

既存の位置をリセットせずに複数のアニメーションを行う方法を誰か提案できますか?

  • アシッシュ・サプケーレ
4

1 に答える 1

0

LeftProperty を null に設定するというあなたの考えは正しいと思いますが、アニメーションが終了した後にそれを行う必要があります。

したがって、アニメーションにデリゲートを追加し、プロパティを null に設定して、動作するかどうかを確認してください。

TopAnimation.Completed += (s,e) =>
{
   _MyWindow.BeginAnimation(Window.TopProperty, null);
};

他のオプションは、ThicknessAnimation または TranslateTransform を使用してウィンドウを移動することです。問題が解決しない場合はお知らせください

于 2015-05-21T09:31:22.777 に答える