Как я могу быстро выровнять средства управления в окне WPF?

Swift 4.2 и более ранние

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"
8
задан Csupor Jenő 24 June 2009 в 21:32
поделиться

5 ответов

Я подумал, что могу избежать выравнивания с помощью кодированного вручную кода 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>
3
ответ дан 5 December 2019 в 15:25
поделиться

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

Быстрый поиск в Google дал базовое руководство:

Введение в элемент управления сеткой WPF

6
ответ дан 5 December 2019 в 15:25
поделиться

Используйте соответствующий элемент управления Panel (StackPanel, DockPanel и т. д.) для желаемого выравнивания вместо использования сетки по умолчанию. Элемент управления Grid позволяет легко начать перетаскивание элементов управления в окно, где вы хотите (не будучи столь же неструктурированным, как Canvas), но не делает никаких предположений о том, какой вид макета вы на самом деле пытаетесь построить.

Если макет, который вы пытаетесь создать, на самом деле представляет собой «сетку» (или таблицу, например, строки и столбцы),

2
ответ дан 5 December 2019 в 15:25
поделиться

Лучше всего использовать Grid или DockPanel.
В большинстве случаев поля не требуются.

0
ответ дан 5 December 2019 в 15:25
поделиться

Я написал настраиваемую панель, которая выполняет «макет формы» (группы из двух столбцов, все метки одинакового размера, все элементы управления одинакового размера, все выровнено и т. Д.), Это в моем блоге по адресу: http://www.nbdtech.com/Blog/archive/2010/07/27/easy-form-layout-in-wpf-part-1-ndash-introduction-formpanel.aspx

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

0
ответ дан 5 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

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