Примените стиль WPF по умолчанию

В Swift 2 функция split верхнего уровня теперь является методом в CollectionType (которому соответствует каждое из «114 представлений символов» String). Есть две версии метода, вы хотите, чтобы тот, который принимает замыкание в качестве предиката, указывает, должен ли данный элемент рассматриваться как разделитель.

Вы можете получить набор символов из строки в виде набора символов UTF16, используя string.utf16, что делает их совместимыми с API NSCharacterSet. Таким образом, мы можем легко проверить внутри замыкания, является ли данный символ в строке членом набора символов новой строки.

Стоит отметить, что split(_:) вернет SubSequence символов (в основном, Slice), поэтому его необходимо преобразовать обратно в массив строк, что, как правило, более полезно. Я сделал это ниже, используя flatMap(String.init) - инициализатор UTF16View в String не работает, поэтому использование flatMap будет игнорировать любые значения nil, которые могут быть возвращены, гарантируя, что вы получите массив необязательных строк назад.

Итак, для хорошего Swift-подобного способа сделать это:

let str = "Line 1\nLine 2\r\nLine 3\n"
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lines = str.utf16.split { newlineChars.characterIsMember([110]) }.flatMap(String.init)
// lines = ["Line 1", "Line 2", "Line 3"]

Что делает это приятным, так это то, что метод split имеет параметр allowEmptySubsequences, который гарантирует, что вы не получите никакого пустые последовательности символов в результате. По умолчанию это false, так что вам вообще не нужно его указывать.

Редактировать

Если вы хотите вообще избежать NSCharacterSet, вы можете так же легко разделить коллекцию юникод-совместимых Character сек.

let lines = str.characters.split { [111] == "\n" || [111] == "\r\n" }.map(String.init)

Свифт может рассматривать "\r\n" как один расширенный кластер графем, используя его как один Character для сравнения вместо создания String. Также обратите внимание, что инициализатор для создания строки из Character не является неисправным, поэтому мы можем просто использовать map.

10
задан akjoshi 15 November 2016 в 13:42
поделиться

1 ответ

Это можно сделать несколькими способами. Если вы посмотрите на Список приоритетов в MSDN то вы можете видеть, что передний план, установленный способами 1-8, переопределит передний план из стиля по умолчанию. Самый простой способ - просто установить локальное значение в TextBox .

<TextBox Foreground="Red" />

Еще вы можете использовать свойство стилей 'BasedOn' , чтобы переопределить другие версии. Для этого требуется указать значение ключа для вашего стиля по умолчанию, но затем его можно использовать для применения значения по умолчанию, как в этом примере:

    <Style TargetType="{x:Type TextBox}"
           x:Key="myTextBoxStyle">
        <Setter Property="Foreground"
                Value="Red" />
        <Setter Property="FontWeight"
                Value="Bold" />
    </Style>
    <!-- Style applies to all TextBoxes -->
    <Style TargetType="{x:Type TextBox}"
           BasedOn="{StaticResource myTextBoxStyle}" />


<TextBox Text="Hello">
    <TextBox.Style>
        <Style BasedOn="{StaticResource myTextBoxStyle}" TargetType="{x:Type TextBox}">
            <Setter Property="Foreground"
                    Value="Blue" />
        </Style>
    </TextBox.Style>
</TextBox>


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

Однако мы можем сделать некоторые другие вещи. Если нам нужен стиль, чтобы не применять некоторые свойства, мы можем установить стиль на {x: Null} , таким образом останавливая применение стиля по умолчанию. Или мы можем дать элементу собственный стиль, который не наследуется от базового стиля, а затем повторно применить только те сеттеры, которые нам нужны:

        <TextBox Text="Hello" Style="{x:Null}" />
        <TextBox Text="Hello">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Setter Property="FontWeight"
                            Value="Bold" />
                </Style>
            </TextBox.Style>
        </TextBox>

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

    <Style TargetType="{x:Type TextBox}"
           x:Key="myTextBoxStyle">
        <Setter Property="FontWeight"
                Value="Bold" />
        <Style.Triggers>
            <Trigger Property="Tag"
                     Value="ApplyForeground">
                <Setter Property="Foreground"
                        Value="Red" />
            </Trigger>
        </Style.Triggers>
    </Style>

   <TextBox Text="Hello" />
    <TextBox Text="Hello" Tag="ApplyForeground" />
11
ответ дан 4 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

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