Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
2383 / 452 / 116
Регистрация: 26.09.2020
Сообщений: 834
WPF

Анимация окна через прозрачность vs Изменение прозрачности роликом мыши

06.12.2024, 23:54. Показов 574. Ответов 9

Author24 — интернет-сервис помощи студентам
В code behind есть код, изменяющий прозрачность окна роликом мыши, работает:
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void OnMouseWheel(object sender, MouseWheelEventArgs e)
{
    if (e.Delta > 0)
    {
        if (Opacity == 1) return;
 
        Opacity = Math.Min(Opacity + .05, 1);
    }
    else if (e.Delta < 0)
    {
        if (Opacity == 0) return;
 
        Opacity = Math.Max(Opacity - .05, 0);
    }
}
При добавлении в xaml анимации появления окна, через прозрачность, при запуске:
XML Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
<Window.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard>
            <Storyboard>
                <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                 From="0"
                                 To="1"
                                 Duration="0:0:0.6"/>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>
прозрачность окна роликом мыши перестаёт изменяться.

Почему так и как совместить или подобное появление окна организовать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.12.2024, 23:54
Ответы с готовыми решениями:

Как сделать анимацию прозрачности окна при наведении курсора мыши и его ухода с окна
Я сделал так (из класса убрал всё лишнее, только по теме оставил): using System; using System.Diagnostics; using System.Windows; ...

Изменение прозрачности чужого окна
подскажите плиз как сделать чужое окно полу прозрачным, вообще трекбаром менять прозрачность другого окна

Управление роликом мыши
Как в OpenGL зделать, так чтобы общая катинка уходила в даль и обратно по оси z, с использование ролика мыши.

9
 Аватар для abit
693 / 472 / 143
Регистрация: 03.02.2013
Сообщений: 1,532
07.12.2024, 01:18
Проблема происходит из-за того, что анимация, привязанная к свойству Opacity, "захватывает" это свойство. После завершения анимации значение Opacity, установленное анимацией, остается "заблокированным" (или "застывшим") в рамках системы анимации WPF. Это поведение связано с тем, как работает система свойств зависимостей (Dependency Properties) в WPF.

Добавлено через 1 минуту
тормозните анимацию через <Storyboard FillBehavior="Stop">
XML Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
<Window.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard>
            <Storyboard FillBehavior="Stop">
                <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                 From="0"
                                 To="1"
                                 Duration="0:0:0.6"/>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</Window.Triggers>
1
2383 / 452 / 116
Регистрация: 26.09.2020
Сообщений: 834
07.12.2024, 01:44  [ТС]
abit, почему так, стало яснее, а вот рецепт с FillBehavior="Stop" не сработал. Прозрачность роликом по-прежнему не меняется.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15973 / 11106 / 2867
Регистрация: 21.04.2018
Сообщений: 32,650
Записей в блоге: 2
07.12.2024, 15:18
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
почему так, стало яснее
Для полной ясности: Список приоритета свойств зависимостей

Добавлено через 7 минут
Цитата Сообщение от abit Посмотреть сообщение
<Storyboard FillBehavior="Stop">
Направление верное, но чуть ошиблись:
XML Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
    <Window.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                     From="0"
                                     To="1"
                                     Duration="0:0:0.6"
                                     FillBehavior="Stop"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
Добавлено через 7 минут
iNNOKENTIY21, но не хорошо когда правильное исполнение кода зависит от двух разных частей.
Лучше метод реализовать так:
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
        private void OnMouseWheel(object sender, MouseWheelEventArgs e)
        {
            double to = 1;
            if (e.Delta > 0)
            {
                if (Opacity != 1)
 
                    to = Math.Min(Opacity + .05, 1);
            }
            else if (e.Delta < 0)
            {
                if (Opacity == 0)
                {
                    to = 0;
                }
 
                else
                {
                    to = Math.Max(Opacity - .05, 0);
                }
            }
 
            BeginAnimation(OpacityProperty, new DoubleAnimation() { To = to, Duration = TimeSpan.FromMilliseconds(200) });
        }
Добавлено через 36 секунд
Тогда безразлично есть ещё анимация у Opacity или нет.
0
2383 / 452 / 116
Регистрация: 26.09.2020
Сообщений: 834
08.12.2024, 00:44  [ТС]
Элд Хасп, FillBehavior="Stop" не работает и в DoubleAnimation с моим методом OnMouseWheel.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
но не хорошо когда правильное исполнение кода зависит от двух разных частей.
Это ж две разных задачи. 1. Анимация окна при запуске; 2. Изменение прозрачности окна роликом мыши в процессе работы приложения.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Лучше метод реализовать так
Это другой метод, он делает анимацию на каждое срабатывание ролика, что медленно, лишнее и ухудшает «пользовательский опыт», «всё тормозит».
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15973 / 11106 / 2867
Регистрация: 21.04.2018
Сообщений: 32,650
Записей в блоге: 2
08.12.2024, 04:06
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Это другой метод, он делает анимацию на каждое срабатывание ролика, что медленно, лишнее и ухудшает «пользовательский опыт», «всё тормозит».
Скорость зависит от TimeSpan.FromMilliseconds(200).
Вместо 200 может поставить 1. И анимация будет мгновенной.

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Это ж две разных задачи. 1. Анимация окна при запуске; 2. Изменение прозрачности окна роликом мыши в процессе работы приложения.
Но как видите, в вашей реализации, это получилось не две разные задачи, а одна зависящая от реализации другой.
Следовательно ваша реализация не верна. О чём я вам и пишу.

Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
FillBehavior="Stop" не работает и в DoubleAnimation с моим методом OnMouseWheel.
У меня работает.
Значит причина в чём-то другом.

Добавлено через 4 минуты
Вот полные коды воспроизведения:
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
<Window x:Class="Core2024.CF.iNNOKENTIY21.Topic3187728.WheelOpacityWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Core2024.CF.iNNOKENTIY21.Topic3187728"
        mc:Ignorable="d"
        Title="WheelOpacityWindow" Height="450" Width="800"
        MouseWheel="OnMouseWheel">
    <Window.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                     From="0"
                                     To="1"
                                     Duration="0:0:0.6"
                                     FillBehavior="Stop"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Window.Triggers>
    <Grid Background="Red">
        
    </Grid>
</Window>
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
25
26
27
28
29
30
31
32
using System.Windows;
using System.Windows.Input;
 
namespace Core2024.CF.iNNOKENTIY21.Topic3187728
{
    /// <summary>
    /// Логика взаимодействия для WheelOpacityWindow.xaml
    /// </summary>
    public partial class WheelOpacityWindow : Window
    {
        public WheelOpacityWindow()
        {
            InitializeComponent();
        }
 
        private void OnMouseWheel(object sender, MouseWheelEventArgs e)
        {
            if (e.Delta > 0)
            {
                if (Opacity == 1) return;
 
                Opacity = Math.Min(Opacity + .05, 1);
            }
            else if (e.Delta < 0)
            {
                if (Opacity == 0) return;
 
                Opacity = Math.Max(Opacity - .05, 0);
            }
        }
    }
}
2
2383 / 452 / 116
Регистрация: 26.09.2020
Сообщений: 834
08.12.2024, 11:07  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня работает. Значит причина в чём-то другом. Вот полные коды воспроизведения
На новом проекте работает.
И с таким набором свойств работает:
XML Скопировано
1
2
WindowStyle="None" AllowsTransparency="True" Background="{x:Null}" Cursor="SizeAll"
ShowInTaskbar="False" SizeToContent="WidthAndHeight" Focusable="False"
Пока перенёс анимацию в корневой grid.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15973 / 11106 / 2867
Регистрация: 21.04.2018
Сообщений: 32,650
Записей в блоге: 2
09.12.2024, 10:38
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
Это ж две разных задачи. 1. Анимация окна при запуске; 2. Изменение прозрачности окна роликом мыши в процессе работы приложения.
Я бы сделал или всё в XAML, или всё в Code Behind.
Для "чистого" XAML - слишком много нужно предварительного Шарп кода: создать присоединённые события и свойства, подымать их при прокрутке колеса. Тогда уже можно будет задавать анимацию в XAML. Для "одноразовой" реализация это излишне сложно. А вот если такие окна и логика нужны много кратно, то это имеет смысл.
Для "одноразовой реализации" лучше подойдёт решение полностью сделанное к Code Behind. Подключиться в конструкторе к о нужным событиям и в обработчиках задать нужные анимации.
0
2383 / 452 / 116
Регистрация: 26.09.2020
Сообщений: 834
09.12.2024, 12:44  [ТС]
Элд Хасп, подписка и обработчики событий в Code Behind, проще, да и не знаю как по другому. Там и дбл.клик и средняя и ролик, ещё и с клавишами модификаторами
А анимацию окна, элементов… в xaml, там естественнее как то. Может темами/шаблонами/стилями разживусь.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15973 / 11106 / 2867
Регистрация: 21.04.2018
Сообщений: 32,650
Записей в блоге: 2
09.12.2024, 14:06
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
А анимацию окна, элементов… в xaml, там естественнее как то.
Анимация прозрачности при загрузке и изменение прозрачности при прокрутке - оказались связанными друг с другом. По факту и то и другое - это новое поведение Окна.
Поэтому анимацию загрузки тоже лучше перенести в Code Behind.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.12.2024, 14:06
Помогаю со студенческими работами здесь

Отлавливание прокрутки роликом мыши
как зделать так чтоюи в Мемо1 можно било прокручивать с помощу ролика на мишке?

Вызов нового окна с роликом из другого
На локальном диске в одной папке находится два ролика 1.swf и 2.swf. Как при нажатии на кнопку в первом ролике в отдельном окне запустить...

Графика, реагирующая на действия мыши и изменение размеров окна
&quot;Создать фрейм и разместить на нем окружность (одну или не сколько). Объект должен &quot;убегать&quot; от указателя мыши. При приближении...

Прозрачность формы, при наведении мыши на кнопку реализовать изменение её положения относительно формы с невозможностью выхода за границы формы
доброй ночи, уважаемые программисты, студенты,а также любители программировать. помогите, пожалуйста, написать программу на языке С++ ...

OnMouseMove. Изменение чувствительности программы на перемещение курсора мыши в границах окна
Подскажите как уменьшить чувствительность программы на перемещение курсора мыши в границах окна, чтобы программа не реагировала на...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
Реализация конвейеров машинного обучения с Python и Scikit-learn
AI_Generated 23.04.2025
Мир данных вокруг нас растёт с каждым днём, и умение эффективно обрабатывать информацию стало необходимым навыком. Специалисты по машинному обучению ежедневно сталкиваются с задачами предобработки. . .
Контроллеры Kubernetes Ingress: Сравнительный анализ
Mr. Docker 23.04.2025
В Kubernetes управление входящим трафиком представляет собой одну из ключевых задач при построении масштабируемых и отказоустойчивых приложений. Ingress — это API-объект, который служит вратами. . .
Оптимизация кода Python с Cython и Numba
py-thonny 23.04.2025
Python прочно обосновался в топе языков программирования благодаря своей простоте и гибкости. Разработчики любят его за читабельность кода и богатую экосистему библиотек. Но у этой медали есть и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер