Pregunta

Quiero desvanecer una ventana en la/en mi aplicación.
La decoloración se produce en Window.Loaded y yo quería fade out en el cierre (Window.Closed o Window.Closing).La decoloración en funciona a la perfección, pero Window.Closing no es el valor permitido para RoutedEvent de la propiedad.
¿ RoutedEvent debo usar para Cerrar?

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

Tengo un error en el Valor de la Ventana".El cierre de' no se puede asignar a la propiedad 'RoutedEvent'.No válido nombre del evento.

¿Fue útil?

Solución

de cierre no es un evento enrutado, por lo que no se puede utilizar en una EventTrigger. Tal vez usted podría comenzar el guión gráfico en el controlador de la ClosingEvent en el código subyacente y cancelar el evento ... algo así:

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

Otros consejos

pensé que me gustaría añadir otra solución de hacer esto, el uso de comportamientos desde el SDK de Expresión y la combina con la solución de @Thomas. Usando esto, podemos definir un "CloseBehavior" que maneja el código detrás de iniciar un guión gráfico y cerrar la ventana cuando se hace.

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

El comportamiento define un guión gráfico como una propiedad de dependencia, por lo que podemos configurarlo en XAML y cuando el AssociatedObject (la ventana donde definimos el comportamiento) se está cerrando, este guión se comenzó a usar Storyboard.Begin(). Ahora, en XAML sólo tenemos que añadir el comportamiento de la ventana con el siguiente 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>

Tenga en cuenta el espacio de nombres XML i de la DLL System.Windows.Interactivity, y también que se hace referencia a la ventana, así que tiene que haber una x:Name asignado. Ahora sólo tenemos que añadir el comportamiento de cada ventana en la que se quiere ejecutar un guión antes de cerrar la aplicación, en lugar de copiar la lógica para cada código subyacente en cada ventana.

No soy un experto en WPF, pero creo que a menos que cancele el evento inicial de cerrar la ventana se ha ido antes de que la animación está aún en marcha.

Al recibir el evento Window.Closing, usted debe cancelar el evento y comenzar la animación. Cuando se realiza la animación se puede cerrar la ventana.

Esto es aún más simple y más corto. Adición de un comportamiento de la siguiente manera:

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

A continuación, en la ventana de agregar una referencia:

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

Introduzca el comportamiento:

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

Conjunto AutoReverse a "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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top