4

我订阅了 wpf 窗口的 Loaded 事件:Loaded += loaded;并尝试在后面的代码中更改某些控件的不透明度。
我注意到在该方法loaded中,控件还没有被 wpf 绘制。所以代码没有效果,控件的渲染只有在方法退出后才会发生。

1) 是否有其他事件Rendered,例如我可以订阅?

编辑:我刚刚发现有一个 OnContentRendered 事件并且以下代码有效:
虽然动画可能更可取。

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)你知道这样一个动画的例子吗?

4

2 回答 2

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>
于 2013-10-30T14:29:41.740 回答
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);
}

然后,在我的类(比如你的加载事件)中,我只是用那个“userControl”对象调用这个静态方法。

MySingletonClass.VisibleFader( this.whateverUserControl );

完成...所以,当可见性改变时,它会从无到 1 淡入。如果某物的可见性被隐藏,它无论如何都消失了。

于 2013-10-30T14:16:53.363 回答