1

我有一个非常简单的 UserControl,它在加载时启动进度条动画:

<UserControl x:Class="WpfApplication2.UserControl1" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ProgressBar Width="200"  Height="10" Maximum="{Binding Delay}" SmallChange="1">
        <ProgressBar.Triggers>
            <EventTrigger RoutedEvent="ProgressBar.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation 
                        Storyboard.TargetProperty="Value" To="{Binding Delay}" Duration="00:00:10" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </ProgressBar.Triggers>
    </ProgressBar>
</UserControl>

动画的To值来自 UserControl 的 DataContext:

class ViewModel
{
    public int Delay
    {
        get { return 10; }
    }
}

UserControl 显示在一个窗口中,如下所示:

var w = new Window();
var vm = new ViewModel();
var c = new UserControl1 {DataContext = vm};
w.Content = c;
w.Owner = this;
w.WindowStartupLocation = WindowStartupLocation.CenterOwner;
// to make the animation play, I have to remove the following line
w.SizeToContent = SizeToContent.WidthAndHeight;
w.ShowDialog();

只要我有线,动画就不会播放

w.SizeToContent = SizeToContent.WidthAndHeight;

在我的代码中。

有没有人对这种非常奇怪的行为有解释并能提出解决方案?

最终目标非常简单。我想要的只是在加载 UserControl/Window 后一段时间(由 viewmodel 指定)的进度条动画。最好是仅 XAML。

4

1 回答 1

2

代替

w.SizeToContent = SizeToContent.WidthAndHeight

使用该代码,我同意它的混乱,但它有效

   w.SourceInitialized += (s, a) =>
            {

                w.SizeToContent = SizeToContent.WidthAndHeight;

                w.UpdateLayout();
                w.Left = this.Left + (this.ActualWidth / 2.0 - w.ActualWidth / 2.0);
                w.Top = this.Top + (this.ActualHeight / 2.0 - w.ActualHeight / 2.0);
            };

不幸的是,我对此没有任何解释。我只知道 WPF 的工作方式以及 Windows 本身在内部处理 Windows 的方式有时会发生冲突。我在设置窗口的左侧/顶部/宽度/高度然后直接最大化它时遇到了同样的问题。为了解决它,我只是将它推迟到SourceInitialized事件被触发。我对您的代码进行了同样的尝试,这似乎是一个类似的问题,因为这成功了。

于 2012-05-11T13:33:24.327 回答