문제

내 응용 프로그램에서 창문을 퇴색시키고 싶습니다.
페이딩이 발생합니다 Window.Loaded 그리고 나는 가까이에서 사라지고 싶었다 (Window.Closed 또는 Window.Closing). 페이딩은 완벽하게 작동하지만 Window.Closing 허용되지 않습니다 RoutedEvent 재산.
RoutedEvent Close에 사용해야합니까?

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

value 'wind 잘못된 이벤트 이름.

도움이 되었습니까?

해결책

마감은 라우팅 된 이벤트가 아니므로 EventTrigger에서 사용할 수 없습니다. 아마도 Code-Behind에서 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의 솔루션과 결합 하여이 작업을 수행하는 또 다른 솔루션을 추가 할 것이라고 생각했습니다. 이를 사용하여 스토리 보드를 시작하고 완료되면 창을 닫는 코드를 처리하는 "CloseBhavior"를 정의 할 수 있습니다.

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 네임 스페이스에 유의하십시오 i System.windows.inceractivity dll, 또한 창이 참조되므로 x:Name 할당된. 이제 각 창의 모든 코드-비인에 논리를 복사하는 대신 응용 프로그램을 닫기 전에 스토리 보드를 실행하려는 모든 창에 동작을 추가합니다.

나는 WPF의 전문가가 아니지만 초기 마감 이벤트를 취소하지 않으면 애니메이션이 시작되기 전에 창이 사라질 것이라고 생각합니다.

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>

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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top