1 / 1 / 0
Регистрация: 07.03.2015
Сообщений: 59
1

Как при нажатии одной кнопки сделать "нажатие" другой кнопки?

07.04.2017, 02:10. Показов 2866. Ответов 13
Метки нет (Все метки)

Как скажем при нажатии одной кнопки сделать "нажатие" другой кнопки? Именно чтобы была анимация нажатия другой кнопки, а не вызов метода нажатия.
Чтобы было видно, что кнопка нажимается. Тип приложения - Universal Windows Platform(UWP).
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2017, 02:10
Ответы с готовыми решениями:

Как запретить сворачиваться окну при нажатии кнопки "свернуть все окна"?
Как запретить сворачиваться окну при нажатии кнопки "свернуть все окна", или отловить событие...

Как реализовать "зажатие" и клик по одной кнопки с разными событиями?
Необходимо создать на кнопку два события. Первое при однократном щелчке. Второе при зажатии на...

Как сделать так чтоб при нажатии кнопки "enter" происходило нажатие кнопки "button1" на форме
Пишу программу которая должна сложить числа по нажатии кнопки "button1". Подскажите, пожалуйста,...

Нажатие кнопки на форме при нажатии "Enter"
Прошу помощи. Искал на форумах, пробовал разные примеры. Ни один не работает. Самый...

13
2054 / 1531 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
07.04.2017, 02:34 2
Ну можно к примеру эмулировать клик мыши отправкой ей последовательно сообщений WM_LBUTTONDOWN и WM_LBUTTONUP
1
1 / 1 / 0
Регистрация: 07.03.2015
Сообщений: 59
07.04.2017, 10:49  [ТС] 3
Я понимаю, что можно путем сообщений WinAPI. Но в данном случае мне надо решить именно другими способами.
До этого надо еще установить курсор мыши на кнопке. Но мне надо другим способом.
Тем более UWP-приложениями насколько я знаю нельзя управлять из других приложений(в том числе из своего) путем передачи сообщений WinAPI, т.к. они полностью защищенные. Как я понял - все команды WinAPI остались только для классических десктопных приложений. А для управления другими UWP-приложениями есть свои специальные стандартные команды. И только с помощью них можно управлять другим UWP-приложением. Если я не правильно понял эту концепцию(или философию UWP), тогда поправьте меня. Спасибо заранее!

Добавлено через 12 минут
Я слышал что можно путем PerformClick, но в UWP они не работают. Можно путем invoke - у меня даже заработали команды, но не совсем то они выполняют.
Я так понял можно это сделать путем байндинга. Т.е. при нажатии одной кнопки нажимается и другая. Но как сделать байндингом не понял.
Или можно сделать путем запуска анимации второй кнопки. Тоже не понял. Но не думаю, то мне анимация нужна. В общем покажите хоть один рабочий метод. Поиск мне ничего не дал.
0
Эксперт .NET
1792 / 1303 / 424
Регистрация: 10.06.2011
Сообщений: 2,106
07.04.2017, 11:13 4
Может быть эту проблему решит использование ToggleButton? Можно связать их свойства IsChecked, и при нажатии на ToggleButton спустя пол-секунды переводить IsChecked обратно в true. Получится типа клик обычный кнопки.
1
25 / 25 / 7
Регистрация: 27.06.2015
Сообщений: 188
07.04.2017, 13:09 5
Тут скорее всего тебе придется создать собственный стель, в стиле определить анимацию кнопки и по нажатию на одну кнопку воспроизводить через биндинг анимацию другой кнопки.
Думаю я верно мыслю. Иначе ни как.
1
1 / 1 / 0
Регистрация: 07.03.2015
Сообщений: 59
07.04.2017, 19:32  [ТС] 6
Мне бы с обычными кнопками. Но в них нет isChecked. В обычных кнопках есть isPressed.
Т.е. правильно я понимаю, что если isPressed сделать true, то кнопка нажмется?
Еще до создания вопроса я пытался это сделать(и многие другие способы), но все время подчеркивается красным и сообщает такую ошибку:
Property or indexer 'Windows.UI.Xaml.Controls.Primitives.ButtonBase.IsPressed' cannot be assigned to -- it is read only
Т.е. я так понимаю это свойство только для чтения. В общем не понятно как сделать.

Добавлено через 3 минуты
Цитата Сообщение от LEX38RUS Посмотреть сообщение
Тут скорее всего тебе придется создать собственный стель, в стиле определить анимацию кнопки и по нажатию на одну кнопку воспроизводить через биндинг анимацию другой кнопки.
Думаю я верно мыслю. Иначе ни как.
Хорошо, но как это сделать? Как вызвать анимацию нажатия другой кнопки через начатие кнопки?
Если можно простой пример для UWP-приложений. Спасибо!
Дополню:
Впринципе можно и не через нажатие кнопки. Мне самое главное - просто как запустить анимацию нажатия кнопки?
0
25 / 25 / 7
Регистрация: 27.06.2015
Сообщений: 188
07.04.2017, 19:58 7
Создай стиль кнопки, определи в ней анимацию ну и воспроизводи её. Посмотри как устроен стиль кнопки. Либо в бленде сам сделай

Добавлено через 2 минуты
К isPressed и не получишь доступ

Добавлено через 7 минут
Да и не понятно, какую цель от этого приследуешь, чтоб нажав одну кнопку воспроизвести анимацию на другой. В чем фишка? Я понимаю некий метод запустить другой кнопки, но зачем нужна анимация нажатия кнопки.
Вот он самый, стиль Button'a
1
1 / 1 / 0
Регистрация: 07.03.2015
Сообщений: 59
08.04.2017, 15:47  [ТС] 8
Вот есть у меня стиль моей кнопки создан и с анимацией:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
<Style x:Key="NewButton" TargetType="Button">
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
                        <GradientStop Color="Blue" Offset="0"></GradientStop>
                        <GradientStop Color="DarkBlue" Offset="1"></GradientStop>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="PointerOver"/>
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Animation"
                                                   Storyboard.TargetProperty="Background">
                                                <DiscreteObjectKeyFrame KeyTime="0" Value="Blue"/>
                                            </ObjectAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled"/>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Border x:Name="Animation" CornerRadius="25"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Background="{TemplateBinding Background}"
                                Height="{TemplateBinding Height}"
                                Width="{TemplateBinding Width}">
                                <ContentPresenter Margin="{TemplateBinding Padding}"
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                Content="{TemplateBinding Content}" />
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
Как же ее воспроизвести? Через RenderTransform или как? Мне нужен рабочий пример. Поиск по всем ссылкам и по всем форумам результата не дал.

Добавлено через 16 часов 7 минут
Может быть эту проблему решит использование ToggleButton? Можно связать их свойства IsChecked, и при нажатии на ToggleButton спустя пол-секунды переводить IsChecked обратно в true. Получится типа клик обычный кнопки.
А как связать свойства isChecked у ToggleButton?
0
25 / 25 / 7
Регистрация: 27.06.2015
Сообщений: 188
09.04.2017, 12:42 9
Как то так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        <Button
            x:Name="Butt1"
            Width="75"
            Margin="282,165,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="Button" />
        <ToggleButton
            x:Name="Butt2"
            Width="75"
            Margin="97,165,0,0"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Content="Button"
            IsChecked="{Binding IsMouseOver, ElementName=Butt1, Mode=OneWay}" />
Но это при наведении мыши на Butt1.
А как это сделать при нажатии на кнопку Butt1 кури Binding. Писать лень, но пример понятен
1
1 / 1 / 0
Регистрация: 07.03.2015
Сообщений: 59
09.04.2017, 14:50  [ТС] 10
При наведении мыши на Butt1 - кнопка Butt2 не нажимается. И наоборот также - ничего не происходит.
0
25 / 25 / 7
Регистрация: 27.06.2015
Сообщений: 188
09.04.2017, 15:42 11
IsChecked = True при навидении мыши на кнопку Butt1, соответственно False когда мышка не наведина.

Добавлено через 1 минуту
Вы просили показать как связать, Вам показали.

Добавлено через 1 минуту
Не прощи будет это все через WinAPI организовать?
1
1 / 1 / 0
Регистрация: 07.03.2015
Сообщений: 59
09.04.2017, 16:15  [ТС] 12
Может быть они и связаны. Ошибок не отображает. Но не происходит ничего. Никакого действия от связи не происходит. Даже путем смены IsMouseOver на Click и другие события.
IsChecked = true только если я сам нажму на кнопку. Никакого нажатия и анимации нет.
Насчет WinAPI - я читал, что это только для классических приложений. Ни определить/изменить заголовок окна, надписи на кнопке, прочитать пароль под звездочками в текстовом поле в UWP - не возможно. Элементы управления не ответят на сообщения. Но если это не так, то я не против узнать про способ с WinAPI. Если бы вы могли рассказать как послать, к примеру, сообщение WM_LBUTTONDOWN кнопке в своем UWP-приложении и какие подключать библиотеки, то я был бы рад. Поиск мне ничего не дал.
0
25 / 25 / 7
Регистрация: 27.06.2015
Сообщений: 188
09.04.2017, 16:33 13
Кто вам такое про винапи сказал? Я нажатием кнопки в одном окне управлял нажатием кнопки в другом. И все прекрасно работало.

Добавлено через 1 минуту
Только что проверял, при навидении на одну кнопку нажатие отоброжается на второй. Вы же сами писали что ни какое событие обробатывать не надо, а только отоброзить анимацию нажатия кнопки.

Добавлено через 14 минут
Вот небольшой пример поиска и нажатия кнопки 1 в калькуляторе
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void button1_Click(object sender, EventArgs e)
        {
            //ищем окно по имени
            IntPtr calcWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "Калькулятор");
            //ищем в окне calcWnd кнопку класса Button с подписью 1
            IntPtr button1 = FindWindowEx(calcWnd, IntPtr.Zero, "Button", "1");
            
            if (button1 != IntPtr.Zero)
            {
                // посылаем нажатие кнопки мыши, последний параметр
                // содержит координаты мыши (скопировано из Spy++)
                SendMessage(button1, WM_LBUTTONDOWN, 1, 0x150018);
                SendMessage(button1, WM_LBUTTONUP, 0, 0x150018);
            }
1
1 / 1 / 0
Регистрация: 07.03.2015
Сообщений: 59
09.04.2017, 18:39  [ТС] 14
Я добавил еще объявление функций:
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
и констант:
int WM_LBUTTONDOWN = 0x201;
int WM_LBUTTONUP = 0x202;
Только SendMessage что-то тупит. Вот такие ошибки выдает:
Argument 3 и 4: cannot convert from 'int' to 'System.IntPtr'. Т.е. не типа IntPtr. Решить не смог. Разве только во втором SendMessage 0 на IntPtr.Zero заменил - стало на одну ошибку меньше. Но остальные 3 и 4 параметры не знаю как поменять.

Добавлено через 13 минут
Дополнение:
Написано - на сайте MS. Калькулятор - стандартное Win32-приложение Windows. Я не так выразился. Стандартными приложениями управлять как и раньше (теперь я вижу) можно, но UWP я так понимаю нет. С браузером Edge и другими UWP-приложениями я так понимаю этот фокус не пройдет. Даже с UWP-вариантом калькулятора. Но я выяснил есть Win32 и COM-компоненты для UWP приложений. Если их разместить в приложении, то только ими и можно управлять. Т.е. чтобы мне нажать кнопку - мне надо не стандартную кнопку, а Win32-компонент разместить и уже потом отправлять ей сообщения. Win32-компоненты умеют отвечать (и это логично) на сообщения WinAPI функций. Возможно я не прав. Я не до конца в теме.
Только что проверял, при навидении на одну кнопку нажатие отоброжается на второй. Вы же сами писали что ни какое событие обробатывать не надо, а только отоброзить анимацию нажатия кнопки.
Вызов события да мне не нужен. Именно нажатие нужно (анимация), но его нет почему то. Обработчик события скажем Click если надо я и так могу вызвать стандартной процедурой обработки скажем Button_Click(null,null);

Добавлено через 1 час 19 минут
Кстати вы точно UWP тип приложения создавали для примера? В UWP по умолчанию передаются такие параметры:
private void button1_Click(object sender, RoutedEventArgs e)
С этими ошибку выдавал: private void button1_Click(object sender, EventArgs e)
Хотел я проверить без SendMessage. Просто с функцией FindWindowEx (найдет ли окно или нет), но на этапе выполнения все время создавалось исключение и перебрасывало в файл App.g.i.cs вот в этот блок:
C#
1
2
3
4
5
6
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
            UnhandledException += (sender, e) =>
            {
                if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
            };
#endif
Даже если все вызовы функции FindWindowEx закомментировать - все равно. И уже после закомментирования объявления этой функции - программа запускалась без исключений. Но функция то не работает, если раскомментировать даже ее объявление. Вот и печально. Непонятно куда смотреть. Где же может быть ошибка?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2017, 18:39

При нажатии кнопки чтобы автоматически происходило нажатие клавиши "W"
Нужно чтобы при нажатии кнопки автоматически происходило нажатие клавиши &quot;W&quot;.Как можно реализовать?

Как сделать выход из окна при нажатии кнопки "Exit" в PyQt5?
Изучаю книгу &quot;Python 3 и PyQt. Разработка приложений.&quot; Книга написана для PyQt4. У меня стоит...

Как сделать, чтобы при выборе поля в ListBox и нажатии кнопки "Выбор" поле исчезло
список ListBox c черырьмя опциями, RadioGroup с теми же опциями, флажок CheckBox, кнопка «Выбор» и...

Как сделать, чтобы при нажатии кнопки "наверх" происходил плавный переход в начало страницы
Здравствуйте. Вот написал программку перемещения наверх при нажатии кнопки. Теперь не знаю, как...


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

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

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