具有情节提要的页面上的 WPF 空闲控件 "RepeatBehavior=" 永远" "



我在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>

然后,我计划使用以下代码控制空闲页面(从另一个站点查找):

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. 由于该动画永远运行,因此空闲控件不会触发。如何让它工作?

把它放在不同的答案中,因为方法不同。将计时器更改为系统计时器以利用 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 的情况下工作。

*

第 1 部分 *

每次进入委托块时,您都会创建新的计时器。

MSDN 的说明:

将"启用"设置为 true 与调用"开始"相同,而将"启用"设置为 false 与调用"停止"相同。

所以第一步我建议至少重构你的代码以重置启用

//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 部分:*

删除重复行为="永远"您的代码将根据计时器开始触发。

最新更新