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