【问题标题】:WPF ProgressBar Loaded event only triggering onceWPF ProgressBar Loaded 事件仅触发一次
【发布时间】:2017-03-20 22:55:30
【问题描述】:

我正在使用 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 没有动画。

是否有不同的事件可以订阅来实现这一点?或者这不可能?

【问题讨论】:

  • 因为它已经被加载,所以它没有动画。尝试用任何其他事件替换
  • 为什么不在按钮点击事件上触发动画呢?毕竟,这就是你真正想要的,不是吗?你的问题不是很清楚。它缺少minimal reproducible example,以及有助于我们了解您尝试过的内容以及具体遇到问题的详细信息。
  • @PeterDuniho 我无法在单击按钮时执行此操作,因为我无法访问 ViewModel 上的控件。
  • 视图模型与它有什么关系?只需将事件触发器放在 XAML 中。如果您仍然需要帮助,请解决您的问题。提供一个好的minimal reproducible example,并准确解释您需要什么。请参阅How to Ask,尤其是该页面底部链接的文章。

标签: c# wpf mvvm


【解决方案1】:

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

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

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

这应该会强制重新加载视图。

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    相关资源
    最近更新 更多