Как избавиться от границы вокруг выбранного элемента ListBox в WPF?

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

^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
  ^^^^^^^^^^^

Кроме того, я предполагаю, что вы хотите совместить 0 или более букв или цифр с (a-z|A-Z|0-9)*. Он должен выглядеть как [a-zA-Z0-9]* (т. Е. Использовать здесь класс символов).

Почему бы не использовать ограничивающий квантификатор, например {1,15}, в конце?

Квантификаторы применяются только в подшаблон слева, будь то группа или класс символов или буквальный символ. Таким образом, ^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$ будет эффективно ограничивать длину второго класса символов [^$%^&*;:,<>?()\"'] до 1 - 15 символов. ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$ будет «ограничивать» последовательность из двух подшаблонов неограниченной длины (так как *+ тоже может совпадать с неограниченным количеством символов) в 1-15 раз, и мы по-прежнему не ограничиваем длина цельной входной строки .

Как работает ограничение на просмотр?

Правильно выглядит (?=.{1,15}$) позитивный просмотр после ^ начало строки anchor . Это утверждение нулевой ширины , которое возвращает только true или false после проверки того, соответствует ли его подшаблон последующим символам. Таким образом, этот lookahead пытается сопоставить любые 1-15 (из-за символов limit quantifier {1,15}), но строки новой строки в конце строки (из-за якоря $). Если мы удалим якорь $ из lookahead, в lookahead потребуется только строка , содержащая от 1 до 15 символов, но общая длина строки может быть любой.

Если входная строка может содержать последовательность строк новой строки, вы должны использовать конструкцию регулярного выражения [\s\S] с любым символом (она будет работать в JS и других общих вариантах регулярных выражений):

^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
 ^^^^^^^^^^^^^^^^^

0
задан JamesHoux 16 January 2019 в 00:18
поделиться

2 ответа

Ответ МаркФельдмана сработал, но возникла проблема с событием щелчка мышью. При использовании элемента Padding on the Border щелчки мыши не регистрируются при щелчке в области дополнения между текстовыми элементами. Чтобы исправить это, я заменил Border на StackPanel и переместил Padding на TextBlock. Заполнение самого текстового блока правильно регистрирует щелчок.

Окончательный xaml:

<UserControl.Resources>
<ResourceDictionary>
    <ControlTemplate x:Key="AppleItemTemplate">
        <StackPanel Opacity="1">
                <TextBlock Padding="10,5" Foreground="{DynamicResource PrimaryTextColor}">
                <TextBlock.Text>
                    <Binding Path="DisplayName"/>
                </TextBlock.Text>
            </TextBlock>
        </StackPanel>
    </ControlTemplate>
    <ControlTemplate x:Key="AppleItemTemplateSelected">
        <StackPanel Background="{DynamicResource LeftSidebarBGColorHighlight}">
            <TextBlock Padding="10,5" Foreground="{DynamicResource PrimaryTextColor}">
                <TextBlock.Text>
                    <Binding Path="DisplayName"/>
                </TextBlock.Text>
            </TextBlock>
        </StackPanel>
    </ControlTemplate>
    <Style TargetType="{x:Type ListBoxItem}" x:Key="AppleContainerStyle">
        <Setter Property="Template" Value="{DynamicResource AppleItemTemplate}"/>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Template" Value="{DynamicResource AppleItemTemplateSelected}"/>
                <Setter Property="BorderThickness" Value="0"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</ResourceDictionary>

0
ответ дан JamesHoux 16 January 2019 в 00:18
поделиться

Если вы просто хотите удалить границу выбранного элемента, попробуйте следующее:

Добавьте <Setter Property="BorderThickness" Value="0"/> в триггер «IsSelected».

В моей демонстрации я нашел, что это работает.

0
ответ дан FranklinLee 16 January 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: