我订阅了wpf窗口的Loaded事件:Loaded += loaded;
并尝试更改后面代码中某些控件的不透明度。
我注意到在方法loaded
中,控件还没有被wpf绘制。因此代码没有效果,控件的呈现仅在退出方法后才会发生。
1)是否还有其他事件,例如我可以订阅Rendered
吗?
protected override void OnContentRendered(EventArgs e)
{
base.OnContentRendered(e);
for (int i = 0; i < 100; i++)
{
Parentpanel.Opacity += 0.01;
Splashscreen.Opacity -= 0.01;
Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle, null);
Thread.Sleep(50);
}
}
否则我可能不得不使用一个动画,将usercontrol1的不透明度从0.1改为1.0,将usercontrol2的不透明度从1.0改为0.0。
2)你知道这样一个动画的例子吗?
答案 0 :(得分:8)
在您的Loaded处理程序中,您可以在调度程序上发布UI更改操作(例如void ChangeOpacity()
):
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(ChangeOpacity));
它将在渲染完成后执行。
修改
我看到你只需要在窗口打开时启动动画。它很容易在XAML中完成,这是一个在Blend中生成的工作示例:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="100" Width="200">
<Window.Resources>
<Storyboard x:Key="myStoryboard">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.Opacity)"
Storyboard.TargetName="myControl">
<EasingDoubleKeyFrame KeyTime="0:0:2" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource myStoryboard}"/>
</EventTrigger>
</Window.Triggers>
<StackPanel>
<TextBox x:Name="myControl" Text="I'm disappearing..." />
</StackPanel>
</Window>
答案 1 :(得分:1)
我最近在尝试在可见性发生变化时向WPF用户控件渲染一些标准化动画时遇到问题。在我的应用程序中,我有几个单例静态类。在其中一个,我添加了一个静态方法“VisibleFader”,你传入框架元素控件,它会自动将事件处理程序附加到针对opacity属性的双动画。它工作得很好,不需要对任何其他样式,控件模板或任何其他主题实现进行任何更改。
public static DoubleAnimation da;
public static void VisibleFader(FrameworkElement fe)
{
if (da == null)
{
da = new DoubleAnimation();
da.From = 0;
da.To = 1;
da.Duration = new Duration(TimeSpan.FromSeconds(.7));
}
fe.IsVisibleChanged += myFader;
}
private static void myFader(object sender, DependencyPropertyChangedEventArgs e)
{
((FrameworkElement)sender).BeginAnimation(FrameworkElement.OpacityProperty, da);
}
然后,在我的类(例如你的Loaded Event)中,我只是用这个“userControl”对象调用这个静态方法。
MySingletonClass.VisibleFader( this.whateverUserControl );
完成......所以,当能见度发生变化时,它会将IN从无变为1逐渐消失。如果某些东西隐藏了它的可见性,它无论如何都会消失。