Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
qmel
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 10
#1

Как отменить запуск анимации в Style.ItemTemplate

17.01.2014, 17:40. Просмотров 900. Ответов 2
Метки нет (Все метки)

Здравствуйте.
Стоит такая задача: создается ListBox на основании шаблона из ResourceDictionary:

XML
1
2
3
4
5
<ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source=Style2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
...
<ListBox ItemsSource="{Binding DataObject}" Style="{StaticResource ItemsList}" />
Данные полей из DataObject составляют значений элементов списка. Одно из них - изображение. И требуется при проведении мышью в области изображения - его увеличить, а при выходе мыши - возвращаться к изначальному состоянию. Сама эта задача - решена. Но имеется проблема "дрожания" картинки при зависании мыши чуть выше границы между изображениями (одна картинка увеличена, а нижняя - бьется туда-сюда).

Как можно устранить это? По идее, это можно было бы решить через обработку флагов в событиях, но как это сделать в XAML? Т.е. если за 1 секунду, мышь успела пройти через картинку и уйти - не выполнять ни увеличение, ни, естественно, обратную анимацию.

WPF лишь начинаю изучать и пока не могу найти решения. Пробовал прописать x:Class для словаря и повесить метод на MouseEnter, а уже в нем делать анимацию. И хотя анимация создается в коде, но она не применяется к объекту на деле.

Style2.xaml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<ResourceDictionary
    ...
x:Class="Style2">
...
<Style x:Key="ItemsList" TargetType="{x:Type ListBox}">
<Setter Property="ItemTemplate">
   <Setter.Value>
       <DataTemplate>
          <Image x:Name="Img" Source="{Binding Picture}" MouseEnter="Img_MouseEnter" >
 
          <!--Image.Triggers>
               <EventTrigger RoutedEvent="UIElement.MouseEnter" >                                        
                                        <BeginStoryboard >
                                            <Storyboard>
                                                <DoubleAnimation From="90" To="180" BeginTime="0:0:0.200" Duration="0:0:0.500" Storyboard.TargetName="sceneImg" Storyboard.TargetProperty="Width" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </EventTrigger>
               <Image.Triggers/-->
...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Style2.xaml.cs
    public partial class Style2 : ResourceDictionary
    {
        public Style2()
        {
            InitializeComponent();
        }
        private void Img_MouseEnter(object sender, MouseEventArgs e)
        {          ...
            DoubleAnimation imgWidth = new DoubleAnimation()
            {
                From = 90,
                To = 180,
                BeginTime = beginTime,
                Duration = duration
            };
            Storyboard.SetTarget(imgWidth, (Image)sender);
            Storyboard.SetTargetProperty(imgWidth, new PropertyPath(Image.WidthProperty));
 
            Storyboard sb = new Storyboard();
            sb.Children.Add(imgWidth);
            sb.Begin();            
        }
     }

Или же можете подсказать, как обработать элементы этого ListBox как ListBoxItems? Не могу понять, как достучаться до них, чтобы повесить обработчики событий, т.к. в ListBox.Items находится мой объект, а вовсе не коллекция ListBoxItems. Чтобы было что-то подобное?
C++
1
2
3
4
 foreach (ListBoxItem item in listScenes.Items.SourceCollection)
            {
                item.MouseEnter += Img_MouseEnter;
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2014, 17:40
Ответы с готовыми решениями:

Как привязаться из ItemTemplate к свойству DataContext
Возможно нубский вопрос, но поиск увы не помог. Например, DataContext котрола...

Запуск анимации, записанной в триггере, из кода
После записи анимации в триггере, можно ли её запускать через код?

Запуск анимации после нажатия на кнопку
Здравствуйте, возникла такая вот проблема: есть анимация для нескольких...

Реализовать многократный запуск анимации для свойства
Здравствуйте, уважаемые форумчане. Создавал мелкую программу и столкнулся с...

Listbox.ItemTemplate позиционирование элементов
Здравствуйте. Не могу разместить картинку с права, пробовал разные варианты но...

2
Водяной Змей
Заблокирован
18.01.2014, 18:08 #2
Здравствуйте!

Если актуально, посмотрите этот пример.
2
Вложения
Тип файла: zip ListBox Image items increasing on MouseEnter.zip (64.9 Кб, 54 просмотров)
jecus
86 / 86 / 36
Регистрация: 27.11.2011
Сообщений: 713
15.08.2014, 13:25 #3
Водяной Змей, а такой вопрос как при выделении элемента оставить ширину как при наведении?и можно ли тоже самое с текстом сделать? заранее спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2014, 13:25

Несколько ItemTemplate для ListBox
Возможно ли прописать для одного ListBox несколько ItemTemplate и выбирать тот...

Отображение ItemTemplate для выбранного значения ComboBox
Добрый день, очередной вопрос к Гуру! Опишу проблему с которой столкнулся на...

Проблема с шаблоном при использовании разных элементов (ItemTemplate и ComboBoxItem)
Делаю шаблон для ComboBox. Определяю ItemTemplate для иного отображения итемов:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru