2013-10-30 3 views
4

wpf 창의로드 된 이벤트 : 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); 
    } 
} 

그렇지 아마 0.1 내지 1.0 및 UserControl2를 1.0에서 0.0으로 UserControl1에 불투명도를 변경하는 애니메이션을 사용한다.

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 속성에 대한 이중 애니메이션에 이벤트 핸들러를 연결합니다. 그것은 위대한 작품과 다른 스타일, 컨트롤 템플릿, 또는 다른 테마 구현에 대한 변경이 필요하지 않습니다.

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에서 페이드 그리고 뭔가 숨겨진에 공개 설정을 가진 경우, 그것은 어쨌든 사라 졌어요 때. 당신의로드 핸들러에서

+0

나는 이것을 나중에 보게 될 것이고, 유망 해 보인다. 나의 편집 btw를 보아라. – Gerard