Aha! Как это часто бывает, когда вы намереваетесь четко определить свою проблему, у вас возникают идеи, как ее решить.
Я сталкивался с этим раньше, но забыл: Z ЗАКАЗАТЬ!
Я знал, что мой элемент управления ControlTemplate будет разделять пространство Content Presenter, потому что он все помещается в Grid.Row 1. Чтобы заставить этот TapGestureRecognizer работать должным образом, мне нужно было определить его в моем ControlTemplate XAML ниже ContentPresenter. Таким образом, элемент управления все еще оказывается в том же месте, НО он оказывается в ТОПе содержимого шаблона, потому что он был определен позже (можно сказать, выше в визуальном стеке).
Точно так же работает TGR. Кажется, у кнопки меньше манер. Кнопка работала нормально, как показано здесь, над ContentPresenter.
Примечание: я нашел этот отличный способ поместить очень многократно используемый ActivityIndicator в мой ControlTemplate. Опять же, он должен быть ниже ContentPreseneter, иначе счетчик будет отображаться на заднем плане, между полями ввода и т. Д.
Подсказка. Возможно, вам не нужно делить пространство с шаблонными элементами управления, но если вы делаете это и хотите, чтобы шаблонные элементы управления были доступны и находились впереди, то определите под ними ContentPresenter в своем шаблоне!
Примечание к TemplateBinding.
Во многих местах отмечалось, что когда вы связываете элемент управления ControlTemplate, вы используете этот синтаксис (например, привязка IsVisible здесь):
IsVisible="{TemplateBinding BindingContext.ShowBack}"
Точно то, на что здесь ссылается BindingContext, зависит .... Если ваша страница устанавливает BindingContext в свой конструктор как "this", тогда шаблон будет искать привязываемое свойство 'ShowBack' в представлении, что шаблон оборачивается содержимым .
Однако если вы установите BindingContext для представления, которое шаблон оборачивает содержимым, в качестве объекта ViewModel, то BindingContext будет искать там связываемое свойство с именем ShowBack. Узнал об этом из экспериментов и подумал, что поделюсь.