locked
Фокус ввода внутри шаблона элемента управления (UWP) RRS feed

  • Вопрос

  • На самом деле я не в курсе проявляется ли это поведение только в UWP или так было и раньше, но решать задачу мне нужно именно в UWP. Очень надеюсь на помощь!!
    Итак в чем суть - есть шаблон CheckBox. Стандартный CheckBox в UWP реагирует на PointerOver и PoenterPress вне зависимости над какой частью CheckBox это произошло. Ну что бы было понятнее:

    Если поместить такой CheckBox в макете UWP и нажать на текст, то галочка снимется/установится, то есть вне зависимости от того над какой частью шаблона был курсор.

    Вот упрощенный шаблон для наглядности:

    <Style x:Key="GroupCheckBoxStyle" TargetType="CheckBox"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="CheckBox"> <Grid Background="{TemplateBinding Background}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="20"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <VisualStateManager.VisualStateGroups/>

    <Grid Height="32" VerticalAlignment="Top"> <Rectangle x:Name="NormalRectangle" Fill="Transparent" Height="20" Stroke="{ThemeResource SystemControlForegroundBaseMediumHighBrush}" StrokeThickness="{ThemeResource CheckBoxBorderThemeThickness}" UseLayoutRounding="False" Width="20"/> <FontIcon x:Name="CheckGlyph" Foreground="{ThemeResource SystemControlHighlightAltChromeWhiteBrush}" FontSize="20" FontFamily="{ThemeResource SymbolThemeFontFamily}" Glyph="&#xE001;" Opacity="0"/> </Grid> <ContentPresenter x:Name="ContentPresenter" AutomationProperties.AccessibilityView="Raw" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Content="{TemplateBinding Content}" Grid.Column="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" TextWrapping="Wrap" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>

    Как видно в стандартном шаблоне есть Grid внутри которого наш квадратик и галочка, а так же есть ContentPresenter.

    Вопрос - как сделать так, что бы события связанные с ContentPresenter не вызывали изменения визуальных состояний. То есть буду ли я наводить курсор или нажимать на то, что внутри Content моего CheckBox'а галоча от этого останется неизменной.

    Сейчас в качестве хака я вместо ContentPresenter использую Button с пустым шаблоном. То есть в данном случае кнопка работает как перехватчик событий и они не доходят до CheckBox'а и визуальные состояния над нужной мне частью не отрабатывают. Хак мне не нравится хотя бы тем, что приходится брать тяжеловесный класс просто для того, что бы использовать его как контейнер.

    У кого какие идеи?


    VB.Net - WPF, UWP

    • Изменено LXGDARK 25 февраля 2016 г. 7:17
    25 февраля 2016 г. 7:11

Ответы

  • В общем никто другого решения не предложил, а гугление меня еще тогда навело на заглушку что я использую - вместо ContentPresenter использовать Button с пустым шаблоном.

    Не красиво, но работает. Пусть пока так и будет.


    VB.Net - WPF, UWP

    • Помечено в качестве ответа LXGDARK 4 марта 2016 г. 15:52
    4 марта 2016 г. 15:52

Все ответы

  • Привет
    А подписаться у презентера на preview событие Click (или что там в UWP) и указать e.Handled = true ?
    25 февраля 2016 г. 7:29
    Отвечающий
  • Привет
    А подписаться у презентера на preview событие Click (или что там в UWP) и указать e.Handled = true ?
    Начиная с WinRT события Preview упразднили. К тому же это то же был бы костыль. Хороший шаблон не подразумевает вмешательство из кода. Да и если браться за код, то лучше уж свой элемент управления написать (что я скорее всего и сделаю, если не найду решения).

    VB.Net - WPF, UWP

    25 февраля 2016 г. 7:40
  • В общем никто другого решения не предложил, а гугление меня еще тогда навело на заглушку что я использую - вместо ContentPresenter использовать Button с пустым шаблоном.

    Не красиво, но работает. Пусть пока так и будет.


    VB.Net - WPF, UWP

    • Помечено в качестве ответа LXGDARK 4 марта 2016 г. 15:52
    4 марта 2016 г. 15:52