Question

Je veux effacer une fenêtre / dans ma demande.
Fading se produit dans le et je voulais Window.Loaded à disparaître à la fermeture (ou Window.Closed Window.Closing). Fondu dans fonctionne parfaitement, mais n'est pas valeur RoutedEvent autorisée pour la propriété <=>.
Que dois-je être <=> en utilisant pour fermer?

    <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>

Je reçois une erreur, la valeur « Window.Closing » ne peut pas être attribué à la propriété « RoutedEvent ». Nom de l'événement non valide.

Était-ce utile?

La solution

La clôture est pas un événement routé, vous ne pouvez pas l'utiliser dans un EventTrigger. Peut-être que vous pourriez commencer le story-board dans le gestionnaire de l'ClosingEvent dans le code-behind et annuler l'événement ... quelque chose comme ça:

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();
}

Autres conseils

Je pensais ajouter une autre solution de le faire, à l'aide des comportements à partir du SDK d'expression et la combinaison avec la solution de @Thomas. En utilisant, nous pouvons définir un « CloseBehavior » qui gère le code derrière de lancer un story-board et fermer la fenêtre quand il est fait.

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);
        }
    }
}

Le comportement que nous pouvons le définir définit un story-board comme une propriété de dépendance, donc en XAML et lorsque la AssociatedObject (la fenêtre où nous définissons le comportement) se ferme, ce story-board est commencé à utiliser Storyboard.Begin(). Maintenant, en XAML nous ajoutons simplement le comportement à la fenêtre en utilisant le code XAML suivant

<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>

Notez l'espace de noms XML de la dll i de System.Windows.Interactivity, et que la fenêtre est référencée, il doit avoir un affecté x:Name. Maintenant, nous ajoutons simplement le comportement à chaque fenêtre sur laquelle nous voulons exécuter un story-board avant de fermer l'application, au lieu de copier la logique à chaque code-behind dans chaque fenêtre.

Je ne suis pas un expert en WPF mais je crois que si vous annulez l'événement de clôture initiale, la fenêtre disparaîtra avant que l'animation est même commencé.

Lors de la réception de l'événement Window.Closing, vous devez annuler l'événement et démarrer l'animation. Lorsque l'animation est terminé, vous pouvez fermer la fenêtre.

Ceci est encore plus simple et plus courte. Ajouter un comportement comme suit:

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;
        }
    }

Ensuite, dans la fenêtre ajouter une référence:

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

Insérer le comportement:

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

Set AutoReverse "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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top