let str = "abcdef"
str[1 ..< 3] // returns "bc"
str[5] // returns "f"
str[80] // returns ""
str.substring(fromIndex: 3) // returns "def"
str.substring(toIndex: str.length - 2) // returns "abcd"
Вам необходимо добавить это расширение String в свой проект (оно полностью протестировано):
extension String {
var length: Int {
return count
}
subscript (i: Int) -> String {
return self[i ..< i + 1]
}
func substring(fromIndex: Int) -> String {
return self[min(fromIndex, length) ..< length]
}
func substring(toIndex: Int) -> String {
return self[0 ..< max(0, toIndex)]
}
subscript (r: Range<Int>) -> String {
let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)),
upper: min(length, max(0, r.upperBound))))
let start = index(startIndex, offsetBy: range.lowerBound)
let end = index(start, offsetBy: range.upperBound - range.lowerBound)
return String(self[start ..< end])
}
}
Даже при том, что У Swift всегда было готовое решение этой проблемы (без расширения String, которое я предоставил ниже), я все же настоятельно рекомендовал бы использовать расширение. Зачем? Потому что это избавило меня от десятков часов мучительной миграции с ранних версий Swift, где синтаксис String менялся почти в каждом выпуске, но все, что мне нужно было сделать, это обновить реализацию расширения, а не рефакторинг всей 300-килограммовой строки кода. приложение. Сделай свой выбор.
let str = "Hello, world!"
let index = str.index(str.startIndex, offsetBy: 4)
str[index] // returns Character 'o'
let endIndex = str.index(str.endIndex, offsetBy:-2)
str[index ..< endIndex] // returns String "o, worl"
String(str.suffix(from: index)) // returns String "o, world!"
String(str.prefix(upTo: index)) // returns String "Hell"
Я подумал, что могу избежать выравнивания с помощью кодированного вручную кода XAML. В итоге я получил следующее (стили можно повторно использовать в других окнах):
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" SizeToContent="WidthAndHeight">
<Window.Resources>
<Style x:Key="ControlStyle" TargetType="Control">
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style BasedOn="{StaticResource ControlStyle}" TargetType="Label">
<Setter Property="Margin" Value="-4,0,0,0"/>
</Style>
<Style BasedOn="{StaticResource ControlStyle}" TargetType="TextBox">
<Setter Property="Width" Value="120"/>
</Style>
<Style BasedOn="{StaticResource ControlStyle}" TargetType="Button">
<Setter Property="MinWidth" Value="70"/>
</Style>
<Style TargetType="Grid">
<Setter Property="Margin" Value="10,10,10,10"/>
</Style>
<Style x:Key="SeparatorColumn" TargetType="ColumnDefinition">
<Setter Property="Width" Value="10"/>
</Style>
<Style x:Key="SeparatorRow" TargetType="RowDefinition">
<Setter Property="Height" Value="3"/>
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Style="{StaticResource SeparatorColumn}"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Style="{StaticResource SeparatorRow}"/>
<RowDefinition/>
<RowDefinition Style="{StaticResource SeparatorRow}"/>
<RowDefinition/>
<RowDefinition Style="{StaticResource SeparatorRow}"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0">Label:</Label>
<TextBox Grid.Row="0" Grid.Column="2">TextBox</TextBox>
<Label Grid.Row="2" Grid.Column="0">Label:</Label>
<TextBox Grid.Row="2" Grid.Column="2">TextBox</TextBox>
<Button Grid.Row="4" Grid.ColumnSpan="3">Button</Button>
<Label Grid.Row="6" Grid.Column="0">Label:</Label>
<TextBox Grid.Row="6" Grid.Column="2">TextBox</TextBox>
</Grid>
</Window>
Используйте сетку, чтобы расположить элементы управления, затем убедитесь, что у вас нет отступов на элементах управления ... если, конечно, вам не нужны отступы, и вы убедитесь, что все они ровные .
Быстрый поиск в Google дал базовое руководство:
Используйте соответствующий элемент управления Panel (StackPanel, DockPanel и т. д.) для желаемого выравнивания вместо использования сетки по умолчанию. Элемент управления Grid позволяет легко начать перетаскивание элементов управления в окно, где вы хотите (не будучи столь же неструктурированным, как Canvas), но не делает никаких предположений о том, какой вид макета вы на самом деле пытаетесь построить.
Если макет, который вы пытаетесь создать, на самом деле представляет собой «сетку» (или таблицу, например, строки и столбцы),
Лучше всего использовать Grid или DockPanel.
В большинстве случаев поля не требуются.
Я написал настраиваемую панель, которая выполняет «макет формы» (группы из двух столбцов, все метки одинакового размера, все элементы управления одинакового размера, все выровнено и т. Д.), Это в моем блоге по адресу: http://www.nbdtech.com/Blog/archive/2010/07/27/easy-form-layout-in-wpf-part-1-ndash-introduction-formpanel.aspx
Он разработан, чтобы его можно было быстро и легко использовать при редактировании XAML, я даже не пробовал его в дизайнере.