Рендеринг не завершен в загруженном событии

Я подписался на событие Loaded окна 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);
   }
}

В противном случае мне, вероятно, придется использовать анимацию, которая изменяет непрозрачность usercontrol1 с 0,1 до 1,0 и usercontrol2 с 1,0 до 0,0.

2) Вы знаете пример такой анимации?

2 ответа

Решение

В обработчике Loaded вы можете опубликовать операцию изменения пользовательского интерфейса (например, 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>

У меня только недавно возникли проблемы при попытке отрисовки некоторой стандартизированной анимации в пользовательских элементах управления WPF при изменении видимости. В моем приложении у меня есть пара одноэлементных статических классов. В одном я добавил статический метод "VisibleFader", и вы передаете элемент управления Framework, и он автоматически присоединяет обработчик событий к двойной анимации со свойством 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 );

Готово... Итак, когда видимость меняется, она исчезает с нуля до 1. И если что-то имеет видимость скрытого, оно все равно исчезает.

Другие вопросы по тегам