Разделитель сетки Silverlight неожиданное поведение

Возможное решение:

var str = "Hello playground"
print("Before: \(str)")
do {
    let regex = try NSRegularExpression(pattern: "\\S", options: [])
    let matches = regex.matches(in: str, options: [], range: NSRange(location: 0, length: str.utf16.count))

    //Retrieve 1/4 elements of the string
    let randomElementsToReplace = matches.shuffled().dropLast(matches.count * 1/4)

    matches.forEach({ (aMatch) in
        if randomElementsToReplace.first(where: { [110].range == aMatch.range } ) != nil {
            str.replaceSubrange(Range(aMatch.range, in: str)!, with: "_")
        } else {
            //Do nothing because that's the one we are keeping as such
        }
    })
    print("After: \(str)")
} catch {
    print("Error while creating regex: \(error)")
}

Идея, лежащая в его основе: использовать тот же шаблон регулярного выражения, что и тот, который вы использовали.
Возьмите в него n элементов (в вашем случае 1/4)
Замените все символы, которых нет в этом коротком списке.

Теперь, когда у вас есть идея, стало еще проще заменить цикл for на

for aMatch in randomElementsToReplace {
    str.replaceSubrange(Range(aMatch.range, in: str)!, with: "_")
}

Благодаря комментарию @Martin R за указание на это.

Вывод (сделано 10 раз):

[112]gt;Before: Hello playground
[112]gt;After: ____o ___y____n_
[112]gt;Before: Hello playground
[112]gt;After: _el__ _______u__
[112]gt;Before: Hello playground
[112]gt;After: _e___ ____g___n_
[112]gt;Before: Hello playground
[112]gt;After: H___o __a_______
[112]gt;Before: Hello playground
[112]gt;After: H___o _______u__
[112]gt;Before: Hello playground
[112]gt;After: __l__ _____ro___
[112]gt;Before: Hello playground
[112]gt;After: H____ p________d
[112]gt;Before: Hello playground
[112]gt;After: H_l__ _l________
[112]gt;Before: Hello playground
[112]gt;After: _____ p____r__n_
[112]gt;Before: Hello playground
[112]gt;After: H___o _____r____
[112]gt;Before: Hello playground
[112]gt;After: __l__ ___y____n_

Вы увидите, что есть небольшая разница с ожидаемым результатом, потому что matches.count == 15, поэтому 1/4 из них должны быть чем? Вам решать сделать правильный расчет в соответствии с вашими потребностями (округлить? И т. Д.), Поскольку вы не указали его.

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

6
задан Baffled by ASP.NET 17 February 2009 в 12:38
поделиться

2 ответа

Вам не нужен средний столбец для gridsplitter. Gridsplitter свяжет с правым краем столбца 0 при помещении разделителя в столбец 0. Можно добавить маленькое поле к сеткам в левой стороне так, чтобы Вы не теряли последние 5 пикселей.

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <!--<ColumnDefinition Width="Auto"/>-->
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>

    <data:DataGrid Name="TLGrid" Grid.Row="0" Grid.Column="0" />
    <data:DataGrid Name="BLGrid" Grid.Row="1" Grid.Column="0"/>

    <!-- Moved the grid splitter to column 0 -->
    <basics:GridSplitter Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" Width="5" />

    <data:DataGrid Name="TRGrid" Grid.Row="0" Grid.Column="2" />
    <data:DataGrid Name="BRGrid" Grid.Row="1" Grid.Column="2" />        
</Grid>
7
ответ дан 8 December 2019 в 16:10
поделиться

Причина ячейки изменяют размер таким образом Вас, испытала, до ColumnDefinition значения и HorizontalAlignment из GridSplitter. Поскольку Вы не указали высоту, значение по умолчанию ширины столбцов к Звезде. Это означает, что у них есть равный интервал. GridSplitter HorizontalAlignment затем указывает, какого направления это изменяет размер. Если Вы будете центрировать или расширять его, то Вы получите оба изменения размеров сторон, но если Вы выровняете его к одному краю или другому, то это только изменит размер того края, но потому что ячейки совместно используют пространство одинаково, оба уменьшения сторон вместо всего один.

Хотя принятый ответ обеспечивает альтернативный подход для получения этой работы, он на самом деле не объясняет, почему проблема происходит. Совершенно приемлемо поместить разделитель в свои собственные ячейки - на самом деле, это часто рекомендуется.

8
ответ дан 8 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

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