22

アプリケーションでウィンドウをフェードイン/フェードアウトしたい。
でフェードインが発生しWindow.Loaded、閉じるときにフェードアウトしたかった (Window.ClosedまたはWindow.Closing)。フェードインは完全に機能しますが、プロパティWindow.Closingの値として許可されていません。閉じるには 何を使用すればよいですか?RoutedEvent
RoutedEvent

    <Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:2" FillBehavior="HoldEnd" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Window.Closing">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:2" FillBehavior="HoldEnd" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>

でエラーが発生します。値 'Window.Closing' をプロパティ 'RoutedEvent' に割り当てることはできません。イベント名が無効です。

4

5 に答える 5

32

Closing はルーティング イベントではないため、EventTrigger では使用できません。おそらく、コード ビハインドの ClosingEvent のハンドラーでストーリーボードを開始し、イベントをキャンセルすることができます...そのようなもの:

private bool closeStoryBoardCompleted = false;

private void Window_Closing(object sender, CancelEventArgs e)
{
    if (!closeStoryBoardCompleted)
    {
        closeStoryBoard.Begin();
        e.Cancel = true;
    }
}

private void closeStoryBoard_Completed(object sender, EventArgs e)
{
    closeStoryBoardCompleted = true;
    this.Close();
}
于 2009-05-15T12:04:02.100 に答える
9

Expression SDK の動作を使用し、@Thomas のソリューションと組み合わせて、これを行う別のソリューションを追加すると思いました。それを使用して、ストーリーボードを開始し、完了時にウィンドウを閉じるコードビハインドを処理する「CloseBehavior」を定義できます。

using System.ComponentModel;
using System.Windows;
using System.Windows.Interactivity;
using System.Windows.Media.Animation;

namespace Presentation.Behaviours {
    public class CloseBehavior : Behavior<Window> {
        public static readonly DependencyProperty StoryboardProperty =
            DependencyProperty.Register("Storyboard", typeof(Storyboard), typeof(CloseBehavior), new PropertyMetadata(default(Storyboard)));

        public Storyboard Storyboard {
            get { return (Storyboard)GetValue(StoryboardProperty); }
            set { SetValue(StoryboardProperty, value); }
        }

        protected override void OnAttached() {
            base.OnAttached();
            AssociatedObject.Closing += onWindowClosing;
        }

        private void onWindowClosing(object sender, CancelEventArgs e) {
            if (Storyboard == null) {
                return;
            }
            e.Cancel = true;
            AssociatedObject.Closing -= onWindowClosing;

            Storyboard.Completed += (o, a) => AssociatedObject.Close();
            Storyboard.Begin(AssociatedObject);
        }
    }
}

動作はストーリーボードを依存関係プロパティとして定義するため、xaml で設定でき、AssociatedObject(動作を定義するウィンドウ) が閉じると、このストーリーボードは を使用して開始されStoryboard.Begin()ます。xaml では、次の xaml を使用してウィンドウに動作を追加するだけです。

<Window x:Class="Presentation.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:behave="clr-namespace:Presentation.Behaviours"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        x:Name="window">
    <Window.Resources>
        <Storyboard x:Key="ExitAnimation">
            <DoubleAnimation Storyboard.Target="{Binding ElementName='window'}"
                             Storyboard.TargetProperty="(Window.Opacity)"
                             Duration="0:0:1" From="1" To="0"/>
        </Storyboard>
    </Window.Resources>

    <i:Interaction.Behaviors>
        <behave:CloseBehavior Storyboard="{StaticResource ExitAnimation}"/>
    </i:Interaction.Behaviors>

    <Grid>
    </Grid>
</Window>

iSystem.Windows.Interactivity dll からの xml 名前空間に注意してください。また、ウィンドウが参照されているため、x:Name割り当てられている必要があります。ここで、各ウィンドウのすべての分離コードにロジックをコピーするのではなく、アプリケーションを閉じる前に、ストーリーボードを実行するすべてのウィンドウに動作を追加するだけです。

于 2012-09-17T15:23:00.023 に答える