Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Анимация закрытия окна  [new]
_гость?_
Guest
Помогите разобраться с закрытием окна. Хотелось сделать анимацию при открытии и закрытии окна, чтобы при открытии окно плавно появлялось из невидимости, а при закрытии наоборот. В первом случае проблем нет, такой триггер все делает на отлично:
<Window.Triggers>
         <EventTrigger RoutedEvent="Window.Loaded">
             <EventTrigger.Actions>
                 <BeginStoryboard>
                     <Storyboard>
                         <DoubleAnimation From="0" To="1" Duration="0:0:0.5"
                                          Storyboard.TargetName="ContentLayout"
                                          Storyboard.TargetProperty="Opacity"/>
                     </Storyboard>
                 </BeginStoryboard>
             </EventTrigger.Actions>
         </EventTrigger>
     </Window.Triggers>


Но при попытке повесить триггер с обратной анимацией на событие Window.Closed возникает исключение.
Помогите решить проблему.
21 май 12, 17:04    [12590317]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

исключение покажи.
21 май 12, 17:08    [12590351]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
Показываю

System.Windows.Markup.XamlParseException occurred
Message='Provide value on 'System.Windows.Baml2006.TypeConverterMarkupExtension' threw an exception.' Line number '17' and line position '10'.
Source=PresentationFramework
LineNumber=17
LinePosition=10
StackTrace:
at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
at WpfApplication1.MyWindow.InitializeComponent() in d:\Projects\Book C#\WPF\WpfApplication1\WpfApplication1\MyWindow.xaml:line 1
at WpfApplication1.MyWindow..ctor() in D:\Projects\Book C#\WPF\WpfApplication1\WpfApplication1\MyWindow.xaml.cs:line 23
InnerException: System.NotSupportedException
Message=RoutedEventConverter cannot convert from System.String.
Source=System
StackTrace:
at System.ComponentModel.TypeConverter.GetConvertFromException(Object value)
at System.Windows.Markup.RoutedEventConverter.ConvertFrom(ITypeDescriptorContext typeDescriptorContext, CultureInfo cultureInfo, Object source)
at System.Windows.Baml2006.TypeConverterMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
InnerException:
21 май 12, 17:11    [12590365]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

покажи что там на 17 строчке и сам документ, который содержит эту строчку.
21 май 12, 17:13    [12590372]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
уТКа
Member

Откуда: Страна дураков и разбитых дорог
Сообщений: 1266
_гость?_,

автор
на событие Window.Closed возникает исключение

может лучше использовать Window.Unloaded ?
21 май 12, 17:19    [12590409]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
тут как раз объявление триггера. Вот весь код окна

<Window x:Class="WpfApplication1.MyWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MyWindow" Height="300" Width="300">
     <Window.Triggers>
         <EventTrigger RoutedEvent="Window.Loaded">
             <EventTrigger.Actions>
                 <BeginStoryboard>
                     <Storyboard>
                         <DoubleAnimation From="0" To="1" Duration="0:0:0.5"
                                          Storyboard.TargetName="ContentLayout"
                                          Storyboard.TargetProperty="Opacity"/>
                     </Storyboard>
                 </BeginStoryboard>
             </EventTrigger.Actions>
         </EventTrigger>
         <EventTrigger RoutedEvent="Window.Closed">
             <EventTrigger.Actions>
                 <BeginStoryboard>
                     <Storyboard>
                         <DoubleAnimation From="1" To="0" Duration="0:0:0.5"
                                          Storyboard.TargetName="ContentLayout"
                                          Storyboard.TargetProperty="Opacity"/>
                     </Storyboard>
                 </BeginStoryboard>
             </EventTrigger.Actions>
         </EventTrigger>
     </Window.Triggers>
     <Grid x:Name="ContentLayout">
     </Grid>
 </Window>


А вот она 17 строка
<EventTrigger RoutedEvent="Window.Closed">
21 май 12, 17:21    [12590427]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

"Window.Closed" откуда взял это название?
21 май 12, 17:30    [12590497]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
Из списка событий окна.
Начинаю понимать, Window.Closed это не маршрутизируемое событие, а я пытаюсь на него повесить триггер, поэтому и вылезает исключение.
Тогда как правильно сделать обработку закрытия окна?
21 май 12, 17:33    [12590516]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

вообще, как тебе подсказали выше, лучше не на closed, потому что там уже ничего нету, как я помню из аналогии winforms.
поэтому поднимись выше до unloaded.
21 май 12, 17:45    [12590582]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
Не заметил сообщение про Unloaded.
Но в любом случае оно не катит, я так понимаю что оно возникает уже после закрытия окна, а мне нужно как раз перед закрытием.
21 май 12, 17:53    [12590615]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
Lelouch
Member

Откуда: Москва
Сообщений: 1878
_гость?_,

Closing?
21 май 12, 17:57    [12590634]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
Lelouch,

Closing тоже не маршрутизируемое событие, такое же исключение как и Closed
21 май 12, 17:59    [12590642]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

ты тогда, просто, запиши код, на событии closing , который дергает storyboard и все.
21 май 12, 18:02    [12590651]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
AlexeiK,
Вот такой код все равно не срабатывает, окно закрывается без вской анимации
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            DoubleAnimation anim = new DoubleAnimation(1.0, 0.0, new Duration(TimeSpan.FromSeconds(2)));
            Storyboard storyboard = new Storyboard();
            Storyboard.SetTargetName(anim, "ContentLayout");
            Storyboard.SetTargetProperty(anim, new PropertyPath(UIElement.OpacityProperty));
            storyboard.Children.Add(anim);
            storyboard.Begin(ContentLayout);
        }


пробовал перекрыть метод OnClosing
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            DoubleAnimation anim = new DoubleAnimation(1.0, 0.0, new Duration(TimeSpan.FromSeconds(2)));
            Storyboard storyboard = new Storyboard();
            storyboard.Completed += (sender, args) => base.OnClosing(e);
            Storyboard.SetTargetName(anim, "ContentLayout");
            Storyboard.SetTargetProperty(anim, new PropertyPath(UIElement.OpacityProperty));
            storyboard.Children.Add(anim);
            storyboard.Begin(ContentLayout);
        }


но тоже не работает.
Но вобще хотелось бы все это сделать разметкой xaml.
21 май 12, 19:32    [12590971]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

ну это.
а если смекалку включить?
в closing делаешь e.cancelevent=true
запускаешь анимацию.
закрываешь окно еще раз кодом.
21 май 12, 22:55    [12591491]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
Получилось только добавить на форму кнопку с таким обработчиком
        private void button1_Click(object sender, RoutedEventArgs e)
         {
             DoubleAnimation anim;
             anim = new DoubleAnimation(1.0, 0.0, new Duration(TimeSpan.FromSeconds(1)));
             anim.Completed += (s, a) => Close();
             this.BeginAnimation(Window.OpacityProperty, anim);
         }


С перехватом события Closing ничего у меня не получилось.
Уважаемый AlexeiK, может подскажете как это должно правильно выглядеть?
Следующий код приводит к тому что окно уходит в прозрачность но не закрыватеся
             e.Cancel = true;
             DoubleAnimation anim;
             anim = new DoubleAnimation(1.0, 0.0, new Duration(TimeSpan.FromSeconds(1)));
             anim.Completed += (s, a) => e.Cancel = false;
             this.BeginAnimation(Window.OpacityProperty, anim);


Но и все таки, хотелось бы узнать, возможно ли такое сделать с помощью триггера, а не в коде.
22 май 12, 08:54    [12592125]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
уТКа
Member

Откуда: Страна дураков и разбитых дорог
Сообщений: 1266
_гость?_,

автор
anim.Completed += (s, a) => e.Cancel = false;

по вашему WPF синхронен?
22 май 12, 09:59    [12592335]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

как тебе выше сказали. ты почти у цели.
только вот e.cancel=false это не то.
вот вместо e.cancel=false поставь this.close .
22 май 12, 11:15    [12592840]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
AlexeiK,
this.Close(); даст только то, что окно будет моргать бесконечно а не закрываться.
Ну сами посмотрите , сначала мы присваиваем e.Cancel = true, потом в процессе вызываем Close(), и все начинается по новой.
             e.Cancel = true;
             DoubleAnimation anim;
             anim = new DoubleAnimation(1.0, 0.0, new Duration(TimeSpan.FromSeconds(1)));
             anim.Completed += (s, a) => this.Close();
             this.BeginAnimation(Window.OpacityProperty, anim);
22 май 12, 11:39    [12593106]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

ну че смекалка не пашет да? :)
сделай bool smartflag=false;
при входе если smartflag=true то пропускай весь свой код в closing, если false то исполняй.
меняй значение smartflag на true когда анимация закончится.

гость, ты иди поспи как человек. поешь белков.
22 май 12, 11:41    [12593128]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
Спасибо, конечно за ответы, но я только начал изучать WPF, поэтому и обратился, чтобы мне внятно объяснили, а не тренировали мою смекалку.
Без флагов что никак нельзя?
Должно же быть какое то решение по аналогии с триггером на Loaded
22 май 12, 12:11    [12593424]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
AlexeiK
Member

Откуда:
Сообщений: 2859
_гость?_,

аналогии между loaded и unloaded нету.
так как при том событии уничтожается объект.
а при loaded он создается.
с уничтоженным объектом производить анимацию смысла нету.
22 май 12, 12:24    [12593537]     Ответить | Цитировать Сообщить модератору
 Re: Анимация закрытия окна  [new]
_гость?_
Guest
ясно, спасибо
22 май 12, 12:39    [12593677]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить