Являются ли Click, Tapped и PointerPressed синонимом в WinRT-XAML?
Имеет ли значение, создаю ли я обработчики событий для PointerPressed, Click или Tapped? IOW, есть ли функциональная разница между следующим:
<Button x:Name="BackButton" PointerPressed="BackButton_Click"/>
<Button x:Name="BackButton" Click="BackButton_Click"/>
<Button x:Name="BackButton" Tapped="BackButton_Click"/>
?
Ответы
Ответ 1
Нажмите, чтобы получить обратную совместимость, и по сути это то же самое, что и Tapped. Tapped - это "жест высокого уровня", который автоматически преобразуется в щелчок, нажатие, нажатие пера и т.д., И это то, что я рекомендовал бы использовать.
PointerPressed - это не то, что вы хотите. Вот почему: если я нажимаю и удерживаю, событие PointerPressed срабатывает, когда я изначально "нажимаю", а затем загорается PointerReleased. Это более низкий уровень, и вы можете принимать решения о том, как долго он был нажат, и т.д. Обычно длинное нажатие не является тем, что вы хотите рассмотреть "Click" или "Tap" , потому что по определению Tap - это более короткая продолжительность. Поэтому для того, что вы хотите, "Tap" лучше всего передает его, потому что он переводит жест для вас, используя системный тайм, для того, что считается "Tap" , и удерживает трюк, и автоматически продвигает клики и ручные нажатия на одно и то же событие. PointerPressed будет срабатывать при нажатии любой кнопки или нажатии пальца независимо от того, как долго длится взаимодействие.
У меня есть довольно активное приложение, которое демонстрирует различные взаимодействия, которые вы можете скачать из http://windows8applications.codeplex.com - просто обратитесь к образцу главы 4, который называется "Touch."
Ответ 2
Ответ Джереми не совсем точен. В другом потоке кто-то сообщил о наличии проблемы с кранами, которые не работают так же, как щелчки при быстром нажатии и нажатии, и их легко воспроизвести с помощью кода ниже и можно легко расширяться до событий указателя.
public sealed partial class MainPage : Page
{
private int clicks = 0;
private int taps = 0;
public MainPage()
{
this.InitializeComponent();
var button = new Button();
button.Width = 500;
button.Height = 200;
button.Content = string.Format("Clicks: {0}, Taps: {1}", clicks, taps);
button.Click += (s, e) => button.Content = string.Format("Clicks: {0}, Taps: {1}", ++clicks, taps);
button.Tapped += (s, e) => button.Content = string.Format("Clicks: {0}, Taps: {1}", clicks, ++taps);
this.Content = button;
}
}
Click
- это то, что вы должны обрабатывать на обычной кнопке. У этого есть логика, ожидаемая от кнопки. Среди вещей, о которых я могу думать,
- он работает как с клавиатурой, так и с помощью мыши
- он работает, даже если вы нажмете кнопку и медленно отпустите ее
- его можно отменить, когда вы нажимаете, перетаскивая его от кнопки, а также возобновляете, перетаскивая назад к нему, предварительно нажав кнопку
- он ограничен одной кнопкой за раз, поэтому, если вы попытаетесь щелкнуть две кнопки вместе - первый коснулся не будет щелчком (иначе, чем на исходном Surface/PixelSense, который поддерживает многопользовательские взаимодействия!)
- он, вероятно, работает лучше с такими вещами, как автоматизация и, как таковой, с возможностями доступности Windows
- он всегда работает
Как показано в примере кода - событие Tapped
не регистрируется для всех кранов, если вы нажимаете повторно. Я не уверен, что это связано с тем, что какая-то базовая логика распознавания жестов видит несколько двойных кранов или просто отвергает все остальные нажатия по любой другой причине. Он работает для быстрых однократных нажатий/ручек или щелчков мыши, но является общим событием, которое вы можете обрабатывать на любом UIElement
и может использоваться, если вы хотите различать краны, двойные краны, правые ответвления (!) Или удерживать произвольные элементы пользовательского интерфейса.
События указателей более низкого уровня, и вы можете использовать их для обработки немного более продвинутых взаимодействий, которые еще не встроены в структуру. Как я уже упоминал, щелчок состоит из нажатия и сопутствующего выпуска, которые происходят на кнопке, поэтому подобное взаимодействие можно смоделировать с помощью событий указателя. Например, вы можете использовать его для реализации своего рода типа игры Whac-A-Mole/Twister, в котором вы хотели бы смять много элементов интерфейса одновременно, что вы не могли сделать с кликами.
Ответ 3
Вам следует использовать кнопки "Click for Buttons" (и ListView, Hyperlink, MenuFlyoutItem, ContentDialog и т.д.). Tapped - это просто событие указателя, поэтому он не запускается, если вы используете клавиатуру, ключ доступа или автоматизацию.
Ответ 4
Я знаю, что это старая тема, но победный ответ неверен, когда говорится, что Click и Tapped по сути одинаковы. Они не. Если вам нужен быстрый щелчок в элементе управления, Tapped не отвечает с той же скоростью, что и Click.
В очень специфических сценариях, например, в настраиваемой цифровой клавиатуре, если пользователь хочет ввести значение, например "11" (дважды нажав одну и ту же кнопку), когда вы используете Tapped, вы часто пропускаете второй символ Таким образом, вы получаете "1", а не "11". Нажмите, этого не происходит.
пс.: Я использую UWP