2013-10-30 90 views
4

我订阅了wpf窗口的Loaded事件:Loaded += loaded;并尝试更改后面代码中某些控件的不透明度。
我注意到在方法loaded控件不是由wpf绘制的。所以代码没有效果,仅在方法退出后才会显示控件。在Loaded事件中渲染未完成

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

+0

您的控件在哪里定义?例如,如果它们是在'ControlTemplate'中定义的,则在引发'Loaded'事件时它们可能不会准备好。在这个例子中,你需要处理['FrameworkElement.OnApplyTemplate'方法](http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx)。 – Sheridan

回答

8

在已加载的处理程序,你可以在调度员发布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> 
+0

正确,您的调度程序看起来比我的想法OnContentRendered更好,但每调用一次调度程序后都必须调用调度程序进行刷新。动画效果并且看起来更好。 – Gerard

+0

这对我很好,谢谢。 Visual Basic .NET 4.5.1等同于我: 'Dispatcher.BeginInvoke(新操作(AddressOf methodName),Windows.Threading.DispatcherPriority.Loaded)' –

1

我刚刚在尝试向可见性更改时向WPF usercontrols呈现一些标准化动画时遇到问题。在我的应用程序中,我有一对单独的静态类。在一个中,我添加了一个静态方法“VisibleFader”,并且你传递了框架元素控件,并且它自动将事件处理程序附加到对opacity属性的双重动画中。它效果很好,不需要对任何其他样式,控件模板或任何其他主题实现进行任何更改。然后,在我的类(例如你的Loaded Event)中,我只是用这个“userControl”对象调用这个静态方法。

MySingletonClass.VisibleFader(this.whateverUserControl); 

做......所以,当能见度的变化,它从一无所有到1渐暗,如果事情是有其公开程度为隐藏,它无论如何不见了。

+0

我会稍后看看,看起来很有希望,看我编辑顺便说一句。 – Gerard