2

表示時にフェードインするウィンドウがあります。初めて使用するときは、アニメーションが実行されません。その後の使用では、正常に動作します。何かを表示するためにインスタンス化するのはリクエスターです。私はそれを保持してインスタンスを再利用しません。リクエスターをインスタンス化し、.Top や .Left などのさまざまなプロパティを設定してから、ShowDialog を呼び出します。コンストラクターでは、DataContext を設定しています。それをコメントアウトすると(別のスレッドが、アニメーションの再生中にデータコンテキストを設定したことが原因である可能性があると示唆したため)、問題を取り除きます。それでも、コンストラクターが呼び出されるまで、ShowDialog を呼び出しません。また、使用するたびに新しいインスタンスをインスタンス化しているため、最初の実行時にのみ問題が発生する理由がわかりません。

アセンブリが最初にロードされているかのようですが、VS 出力ウィンドウにはこれが発生していません。

ウィンドウは不透明度ゼロから始まるため、表示されることでアニメーションがトリガーされていることを示します。実行する時間がないだけです。BeginTime を 0.5 秒に設定すると、毎回動作しますが、ボタンを押したときに表示されると明らかに遅くなり、低速のマシンではまだ十分でない可能性があります。

XAMLでアニメーションを定義しています

<Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <BeginStoryboard>
            <Storyboard Name="FormFade">
                <DoubleAnimation Name="FormFadeAnimation"
                                 Storyboard.TargetProperty="(Window.Opacity)"
                                 From="0.0" To="1.0" Duration="0:0:0.25"
                                 AutoReverse="False" RepeatBehavior="1x"
                                 BeginTime="0:0:0"/>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>

トリガーするより適切なイベントはありますか? Window.Initialized と Window.IsVisibleChanged を試しましたが、どちらもルーティング イベントではないように見えるため、XAML が解析されると例外がスローされます。

すべてをコード ビハインドに移行することもできますが (フェードアウトはとにかくそこで行う必要があるため)、可能であれば xaml にあることを好みます。

Dispatcher.BeginInvoke から DataContext を割り当てることはできますが、それは面倒なようで、将来的に入力するフィールドがある場所では、おそらくアニメーションの後に発生し、見栄えが悪いため、後で問題を隠します。

これについて何か考えている人はいますか?

4

1 に答える 1

1

このコードを試してください:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="WpfApplication2.MainWindow"
    x:Name="thisWindow"
    Title="MainWindow"
    Width="640" Height="480" AllowsTransparency="True" WindowStyle="None">

    <Window.Resources>
        <Storyboard x:Key="MyStoryboard">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="thisWindow">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Window.Resources>
    <Window.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
        </EventTrigger>
    </Window.Triggers>

    <Grid x:Name="LayoutRoot"/>

</Window>
于 2013-04-10T08:59:53.380 に答える