質問

私は自分のアプリケーションに/で窓をフェードアウトしたい。
フェードインすることWindow.Loadedで発生し、私は近い(Window.ClosedまたはWindow.Closing)にフェードアウトしたかったです。 完璧な作品にフェージングが、Window.ClosingRoutedEventプロパティの値を許可されていません。
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」に割り当てることはできません上のエラーを取得します。無効なイベント名。

役に立ちましたか?

解決

閉会のルーティングイベントではありませんので、あなたは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();
}

他のヒント

私は、これをやって表現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>

XML名前空間System.Windows.InteractivityのDLLからi、また、窓が参照されていること、それはx:Nameが割り当てられていることがあるので注意してください。今、私たちは、単に私たちがアプリケーションを閉じて、代わりのすべてのコードビハインド各ウィンドウ内にロジックをコピーする前に、ストーリーボードを実行したい上のすべてのウィンドウに動作を追加。

私は、WPFの専門家ではないが、私はあなたが最初のClosingイベントをキャンセルしない限り、アニメーションにも開始される前に、ウィンドウが消えてしまいますと信じています。

Window.Closingイベントを受信すると、あなたがイベントをキャンセルして、アニメーションを開始する必要があります。アニメーションが完了したら、ウィンドウを閉じることができます。

これがさらに簡単かつ短いです。次のように振る舞いを追加します:

public class WindowClosingBehavior : Behavior<Window>
    {
        protected override void OnAttached()
        {
            AssociatedObject.Closing += AssociatedObject_Closing;
        }

        private void AssociatedObject_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Window window = sender as Window;
            window.Closing -= AssociatedObject_Closing;
            e.Cancel = true;
            var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(0.5));
            anim.Completed += (s, _) => window.Close();
            window.BeginAnimation(UIElement.OpacityProperty, anim);
        }
        protected override void OnDetaching()
        {
            AssociatedObject.Closing -= AssociatedObject_Closing;
        }
    }

次に、あなたのウィンドウに参照を追加します:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:wt="clr-namespace:Desktop.Themes.WindowTask;assembly=Desktop.Themes"

行動を挿入します:

<i:Interaction.Behaviors>
     <wt:WindowClosingBehavior />
</i:Interaction.Behaviors>

設定オートリバースを "true"

<Window.Triggers>
        <EventTrigger RoutedEvent="Window.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Opacity" AutoReverse="True" From="0" To="1" Duration="0:0:0.5" FillBehavior="HoldEnd" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top