Как условно запустить код в пузырьковом событии, если отправитель является оригинальным источником? (Приложение UWP) - PullRequest
0 голосов
/ 03 ноября 2018

В моем приложении UWP есть шаблонный элемент управления, который отвечает на событие PointerReleased. Этот шаблонный элемент управления вложен в другие экземпляры элемента управления. Таким образом, CustomContentControl принадлежит CustomContentControl, который принадлежит CustomContentControl ... и так далее. Это событие всплывает, и важно, чтобы элемент управления всплывал, но одна строка кода должна выполняться только для элемента управления, на который я нажал.

Мне нужен обработчик событий для условного запуска строки кода только , если это элемент управления, на который я нажал. Я думал, что смогу сравнить объект отправителя с исходным источником.

Проблема в том, что когда я пытаюсь получить event.OriginalSource (событие является объектом PointerRoutedEventArgs), он не возвращает пользовательский элемент управления, а скорее часть шаблона, использованного для создания этого элемента управления. Я попытался выполнить такой поиск, чтобы найти родителя (в надежде найти мой CustomContentControl), например так ...

// test to see if template part belongs to a CustomContentControl
var test = (FrameworkElement)e.OriginalSource;
var found = false; var tryAgain = 0;
while (!found && tryAgain < 3) { //try 3 times and then quit
    if (test.Parent as CustomContentControl == null) {
        test = (FrameworkElement)test.Parent; tryAgain++;
        Debug.WriteLine(test.Name);
    } else {
        found = true;
        // do something with CustomContentControl ...
    }
}

... но к тому времени, когда цикл поднимается выше по иерархии, ближе к CustomContentControl, test становится нулевым (я не могу найти конкретный элемент управления, к которому он принадлежит)

Я застрял. Мой вопрос: как мне запустить строку кода только , если я нажал на элемент управления?

1 Ответ

0 голосов
/ 03 ноября 2018

Я обнаружил, что если я прикреплю событие к шаблонной части элемента управления, это будет только пузыри для элементов в этом элементе управления. Прикрепите это же событие к самому элементу управления, и оно будет пузыриться (если это не пользовательское событие, и в этом случае во время написания не будет пузыриться).

Таким образом, я могу написать код для события, которое будет влиять только на сам элемент управления, и другой код, который будет влиять на элемент управления и переходить к другим элементам управления.

Внутри моего OnApplyTemplate() в рамках моего шаблонного контроля ...

var templatedPartOfControl 
    = GetTemplateChild("TemplatedControlName") as FrameworkElement;
templatedPartOfControl.PointerReleased += method_noBubbleUp;
this.PointerReleased                   += method_BubbleUp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...