DataContext与EventTriggers对比Window.SizeToContent

时间:2012-05-11 12:51:07

标签: wpf binding

我有一个非常简单的UserControl,可以在加载时启动progess bar动画:

<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。

1 个答案:

答案 0 :(得分: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事件被触发。我对你的代码做了同样的尝试,这似乎是一个类似的问题,因为这样做了。