WPF ProgressBar Loaded事件仅触发一次

时间:2017-03-20 07:05:09

标签: c# wpf mvvm

我使用MVVM并让我的MainWindow具有以下属性绑定:

<ContentControl x:Name="MainContentControl" Content="{Binding CurrentPage}" Margin="10,50,10,38"/>

单击按钮,我将CurrentPage设置为新的视图绑定,其上有一个ProgressCarControl:

private void HomeButtonClick(object obj)
        {
            CurrentPage = new HomeViewModel();
        }


<ProgressBar Cursor="Hand"
            Name="EffortProgressBar" Value="{Binding Home.Effort, Mode=TwoWay}" Foreground="{Binding RelativeSource={RelativeSource Mode=Self}, 
            Path=Value, Converter={StaticResource ProgressForegroundConverter}}" 
            Height="12" Canvas.Left="30" Canvas.Top="75" Width="25" RenderTransformOrigin="0.5,0.5">
            <ProgressBar.RenderTransform>
                <TransformGroup>
                    <ScaleTransform ScaleY="-1"/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </ProgressBar.RenderTransform>
            <ProgressBar.Triggers>
                <EventTrigger RoutedEvent="ProgressBar.Loaded">
                    <BeginStoryboard>
                        <Storyboard >
                            <DoubleAnimation Storyboard.TargetProperty="Value" From="0" To="{Binding Home.Effort, Mode=TwoWay}" Duration="0:0:01"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </ProgressBar.Triggers>
        </ProgressBar>

当我单击主页按钮加载页面时,ProgressBar会正确设置动画,但当我再次单击该按钮时,ProgressBar不会设置动画。

是否有不同的事件要订阅才能实现此目的?或者这不可能吗?

1 个答案:

答案 0 :(得分:1)

当您设置源属性DataTemplate的{​​{1}}属性绑定到相同类型的新值时,Content不会重新加载。

最简单的解决方法可能是通过在将ContentControl属性设置为Content的新实例之前将CurrentPage属性设置为空来清除HomeViewModel。为此,您需要返回调用者并让调度程序在重置CurrentPage属性之前更新UI:

private async void HomeButtonClick(object obj)
{
    if (CurrentPage != null && CurrentPage is HomeViewModel)
    {
        CurrentPage = null;
        await Task.Delay(1);
    }
    CurrentPage = new HomeViewModel();
}

这会强制重新加载视图。