0

以下のように、xaml ページで単純なリピート アニメーションを試しています。

<StackPanel Canvas.Left="1" Canvas.Top="1">
    <StackPanel.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard x:Name="sb_PathGeometry" RepeatBehavior="Forever">
                     <PointAnimationUsingPath Storyboard.TargetName="PathGeometry"  
                          Storyboard.TargetProperty="Center"  
                          Duration="0:0:1">
                          <PointAnimationUsingPath.PathGeometry>
                              <PathGeometry Figures="M 10,0 L 10,-182 L -199,-182" />
                          </PointAnimationUsingPath.PathGeometry>
                     </PointAnimationUsingPath>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </StackPanel.Triggers>
</StackPanel>

その後、以下のコードを使用してアイドル ページを制御する予定です (Find from another site):

using System.Windows.Threading;
using System.Windows.Interop;

namespace DS
{
    public partial class MontagePage : Page
    {
        private EventHandler handler;

        public MontagePage()
        {
            InitializeComponent();

            handler = delegate
            {
                DispatcherTimer timer = new DispatcherTimer();
                timer.Interval = TimeSpan.FromSeconds(4);
                timer.Tick += delegate
                {
                    if (timer != null)
                    {
                        timer.Stop();
                        timer = null;
                        System.Windows.Interop.ComponentDispatcher.ThreadIdle -= handler;
                        ComponentDispatcher_ThreadIdle();
                        System.Windows.Interop.ComponentDispatcher.ThreadIdle += handler;
                    }
                };
                timer.Start();

                //System.Windows.Interop.ComponentDispatcher.ThreadIdle -= handler;
                Dispatcher.CurrentDispatcher.Hooks.OperationPosted += delegate
                {
                    if (timer != null)
                    {
                        timer.Stop();
                        timer = null;
                    }
                };
            };

            ComponentDispatcher.ThreadIdle += handler;
        }

        void ComponentDispatcher_ThreadIdle()
        {
            //Go to IdlePage.xaml
            IdlePage idlepage = new IdlePage();
            this.NavigationService.Navigate(idlepage);
        }
    }
}

私が要約できる問題は次のとおりです。

  1. そのアニメーションが永久に実行されているため、アイドル コントロールは起動していません。それを機能させる方法は?
4

2 に答える 2

0

* パート1 *

デリゲート ブロックに入るたびに新しいタイマーを作成しています。

MSDN からのメモ:

Enabled を true に設定することは Start を呼び出すことと同じですが、Enabled を false に設定することは Stop を呼び出すことと同じです。

したがって、最初のステップでは、少なくともコードをリファクタリングして、有効にリセットすることをお勧めします

//sorry I changed your delegates to lambda's for my convenience (personal pref), but the point stands
public MontagePage()
    {
        InitializeComponent();
        timer.Interval = TimeSpan.FromSeconds(4);

        handler = (s1,a1) =>
        {
            timer.Tick += (s2, a2) =>
            {
                if (timer.IsEnabled)
                {
                    timer.IsEnabled = false;
                    ComponentDispatcher.ThreadIdle -= handler;
                    ComponentDispatcher_ThreadIdle();
                    ComponentDispatcher.ThreadIdle += handler;
                }
            };
            timer.Start();

            Dispatcher.CurrentDispatcher.Hooks.OperationPosted 
                += (s, a)
                    =>
                    {
                        if (timer.IsEnabled)
                            timer.IsEnabled = false;
                    };
        };

        ComponentDispatcher.ThreadIdle += handler;
    }

* パート2:*

RepeatBehavior="Forever" を削除すると、コードはタイマーに従って発火を開始します。

于 2012-04-25T15:27:26.927 に答える
0

アプローチが異なるため、これを別の答えに入れます。タイマーをシステム タイマーに変更して、別のスレッドでアクションを生成できる timer.elapsed を活用します。

 public MontagePage()
    {
        InitializeComponent();

        var timer = new System.Timers.Timer {Interval = 4000, Enabled = true};
        timer.Elapsed += (s, a) => Task.Factory.StartNew(ComponentDispatcher_ThreadIdle);

        .....

これは、XAML を変更しなくても機能します。

于 2012-04-25T15:57:55.087 に答える