Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Анимация закрытия окна / 23 сообщений из 23, страница 1 из 1
21.05.2012, 17:04
    #37804402
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
Помогите разобраться с закрытием окна. Хотелось сделать анимацию при открытии и закрытии окна, чтобы при открытии окно плавно появлялось из невидимости, а при закрытии наоборот. В первом случае проблем нет, такой триггер все делает на отлично:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<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 возникает исключение.
Помогите решить проблему.
...
Рейтинг: 0 / 0
21.05.2012, 17:08
    #37804417
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

исключение покажи.
...
Рейтинг: 0 / 0
21.05.2012, 17:11
    #37804423
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
Показываю

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:
...
Рейтинг: 0 / 0
21.05.2012, 17:13
    #37804427
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

покажи что там на 17 строчке и сам документ, который содержит эту строчку.
...
Рейтинг: 0 / 0
21.05.2012, 17:19
    #37804444
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

авторна событие Window.Closed возникает исключение
может лучше использовать Window.Unloaded ?
...
Рейтинг: 0 / 0
21.05.2012, 17:21
    #37804454
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
тут как раз объявление триггера. Вот весь код окна

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<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">
...
Рейтинг: 0 / 0
21.05.2012, 17:30
    #37804471
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

"Window.Closed" откуда взял это название?
...
Рейтинг: 0 / 0
21.05.2012, 17:33
    #37804479
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
Из списка событий окна.
Начинаю понимать, Window.Closed это не маршрутизируемое событие, а я пытаюсь на него повесить триггер, поэтому и вылезает исключение.
Тогда как правильно сделать обработку закрытия окна?
...
Рейтинг: 0 / 0
21.05.2012, 17:45
    #37804511
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

вообще, как тебе подсказали выше, лучше не на closed, потому что там уже ничего нету, как я помню из аналогии winforms.
поэтому поднимись выше до unloaded.
...
Рейтинг: 0 / 0
21.05.2012, 17:53
    #37804525
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
Не заметил сообщение про Unloaded.
Но в любом случае оно не катит, я так понимаю что оно возникает уже после закрытия окна, а мне нужно как раз перед закрытием.
...
Рейтинг: 0 / 0
21.05.2012, 17:57
    #37804535
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

Closing?
...
Рейтинг: 0 / 0
21.05.2012, 17:59
    #37804539
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
Lelouch,

Closing тоже не маршрутизируемое событие, такое же исключение как и Closed
...
Рейтинг: 0 / 0
21.05.2012, 18:02
    #37804542
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

ты тогда, просто, запиши код, на событии closing , который дергает storyboard и все.
...
Рейтинг: 0 / 0
21.05.2012, 19:32
    #37804664
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
AlexeiK,
Вот такой код все равно не срабатывает, окно закрывается без вской анимации
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        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
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        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.
...
Рейтинг: 0 / 0
21.05.2012, 22:55
    #37804847
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

ну это.
а если смекалку включить?
в closing делаешь e.cancelevent=true
запускаешь анимацию.
закрываешь окно еще раз кодом.
...
Рейтинг: 0 / 0
22.05.2012, 08:54
    #37805096
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
Получилось только добавить на форму кнопку с таким обработчиком
Код: c#
1.
2.
3.
4.
5.
6.
7.
        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, может подскажете как это должно правильно выглядеть?
Следующий код приводит к тому что окно уходит в прозрачность но не закрыватеся
Код: c#
1.
2.
3.
4.
5.
             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);



Но и все таки, хотелось бы узнать, возможно ли такое сделать с помощью триггера, а не в коде.
...
Рейтинг: 0 / 0
22.05.2012, 09:59
    #37805181
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

авторanim.Completed += (s, a) => e.Cancel = false;
по вашему WPF синхронен?
...
Рейтинг: 0 / 0
22.05.2012, 11:15
    #37805341
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

как тебе выше сказали. ты почти у цели.
только вот e.cancel=false это не то.
вот вместо e.cancel=false поставь this.close .
...
Рейтинг: 0 / 0
22.05.2012, 11:39
    #37805406
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
AlexeiK,
this.Close(); даст только то, что окно будет моргать бесконечно а не закрываться.
Ну сами посмотрите , сначала мы присваиваем e.Cancel = true, потом в процессе вызываем Close(), и все начинается по новой.
Код: c#
1.
2.
3.
4.
5.
             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);
...
Рейтинг: 0 / 0
22.05.2012, 11:41
    #37805414
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

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

гость, ты иди поспи как человек. поешь белков.
...
Рейтинг: 0 / 0
22.05.2012, 12:11
    #37805524
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
Спасибо, конечно за ответы, но я только начал изучать WPF, поэтому и обратился, чтобы мне внятно объяснили, а не тренировали мою смекалку.
Без флагов что никак нельзя?
Должно же быть какое то решение по аналогии с триггером на Loaded
...
Рейтинг: 0 / 0
22.05.2012, 12:24
    #37805555
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
_гость?_,

аналогии между loaded и unloaded нету.
так как при том событии уничтожается объект.
а при loaded он создается.
с уничтоженным объектом производить анимацию смысла нету.
...
Рейтинг: 0 / 0
22.05.2012, 12:39
    #37805606
_гость?_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анимация закрытия окна
ясно, спасибо
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Анимация закрытия окна / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]