Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF MVVM-属性更改上的触发器情节提要只发生一次_Wpf_Animation_Mvvm_Data Binding_Storyboard - Fatal编程技术网

WPF MVVM-属性更改上的触发器情节提要只发生一次

WPF MVVM-属性更改上的触发器情节提要只发生一次,wpf,animation,mvvm,data-binding,storyboard,Wpf,Animation,Mvvm,Data Binding,Storyboard,在我的视图模型中,我有一个计时器,需要使边框背景每5分钟闪烁一次 在我看来,边界是: <Border Name="btnBorder" Grid.Row="0" Grid.Column="0" Opacity="1" CornerRadius="10,10,0,0"> <Border.Style> <Style TargetType="Border"> <Style.Setters>

在我的视图模型中,我有一个计时器,需要使边框背景每5分钟闪烁一次

在我看来,边界是:

<Border Name="btnBorder" Grid.Row="0" Grid.Column="0" Opacity="1" CornerRadius="10,10,0,0">
    <Border.Style>
        <Style TargetType="Border">
            <Style.Setters>
                <Setter Property="Background" Value="#e2e2e2"></Setter>
            </Style.Setters>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=ViewEventTrigger}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
                                    <EasingColorKeyFrame KeyTime="00:00:00.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:00.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:01.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:01.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:02.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:02.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:03.000" Value="#e2e2e2"/>
                                    <EasingColorKeyFrame KeyTime="00:00:03.500" Value="#163f6b"/>
                                    <EasingColorKeyFrame KeyTime="00:00:04.000" Value="#e2e2e2"/>
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>
以及需要触发。。。嗯,触发器:

private void ShowInfocenterIfAnyItinirary(object sender, ElapsedEventArgs e)
{
    ViewEventTrigger = "";
    ViewEventTrigger = "True";
}
我用鼠标触发故事板来测试它。但我无法通过将它绑定到我的财产来实现它

编辑:

我将datacontext设置为:

d:DataContext="{d:DesignInstance local:ItineraryViewModel}"
private void ShowInfocenterIfAnyItinirary(object sender, ElapsedEventArgs e)
{
    if (Items.Count <= 0) return;
    GlobalEvents.TriggerShowMainWindowEvent();
    ViewEventTrigger = "True";
    Task.Run(async () =>
    {
        Thread.Sleep(4000);
        ViewEventTrigger = "False";
    });
}
此外,我还有很多其他工作正常的数据绑定,比如要显示的数据和按钮命令。但我就是不能让触发器执行storybord

方法
ShowInfocenterIfAnyItinirary()
由在viewmodel中启动的计时器执行

计时器代码:

private readonly Timer _timer = new Timer();
public ItineraryViewModel()
{
    _timer.Interval = 5000;
    _timer.Elapsed += ShowInfocenterIfAnyItinirary;
    _timer.Start();
}
编辑2:

我已经延迟了程序运行时动画应该开始的时间。我发现动画确实会运行,但只运行一次。我以前没有看到它,因为窗口开始最小化

无论触发器事件发生多少次,为什么它只运行一次?

这只设置设计时数据上下文:

d:DataContext="{d:DesignInstance local:ItineraryViewModel}"
当您实际运行应用程序时,这不会产生任何影响

您应该将视图的
DataContext
属性设置为视图模型的实例:

private string _viewEventTrigger = "";
public string ViewEventTrigger
{
    get => _viewEventTrigger ?? (_viewEventTrigger = "");
    private set
    {
        if (_viewEventTrigger == value)
            return;

        _viewEventTrigger = value;
        OnPropertyChanged();
    }
}
<Window ...>
    <Window.DataContext>
        <local:ItineraryViewModel />
    </Window.DataContext>

我最终解决了这样的问题:

d:DataContext="{d:DesignInstance local:ItineraryViewModel}"
private void ShowInfocenterIfAnyItinirary(object sender, ElapsedEventArgs e)
{
    if (Items.Count <= 0) return;
    GlobalEvents.TriggerShowMainWindowEvent();
    ViewEventTrigger = "True";
    Task.Run(async () =>
    {
        Thread.Sleep(4000);
        ViewEventTrigger = "False";
    });
}
private void showInfocenterIfanyinitirary(对象发送方,ElapsedEventArgs e)
{
if(Items.Count)
{
睡眠(4000);
ViewEventTrigger=“False”;
});
}
这将停止动画,而不是使其在终点处暂停