Текстовое поле не будет растягиваться, чтобы заполнить окно просмотра - PullRequest
7 голосов
/ 04 января 2012

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

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

Вот пример кода, с которым я работаю:

  <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.186*"/>
            <ColumnDefinition Width="0.814*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.127*"/>
            <RowDefinition Height="0.873*"/>
        </Grid.RowDefinitions>
        <Viewbox Margin="0,0,0.917,0">
            <Label Content="First name:"/>
        </Viewbox>
        <Viewbox Grid.Column="1">
            <TextBox TextWrapping="Wrap"/>
        </Viewbox>
    </Grid>

Я пытался разместить grid, stackpanel иdockpanel (with LastChildFill = "True") в окне просмотра, а затем размещение текстовых полей в этих элементах управления макетом, но это тоже не сработало.Есть ли способ получить текстовые поля для горизонтального заполнения родительского окна просмотра?

Эта проблема похожа на эту: Текстовое поле WPF не заполняет StackPanel , но эта проблема связана с панелями стека, а не с окнами просмотра.

Ответы [ 2 ]

11 голосов
/ 04 января 2012

Я думаю, то, что вы хотите, не легко возможно.ViewBox сообщает своим дочерним элементам, что в проходе макета у них есть ограниченное пространство.После этого дисплей помещается в окно просмотра.Теперь текстовое поле с бесконечным пространством явно не может растягиваться.У меня есть 2 решения, которые, я думаю, не то, что вам нужно, но они могут быть полезны в любом случае.

Первое:

<Viewbox Grid.Column="1" Grid.Row="0" Stretch="Uniform" >
    <Grid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Viewbox}}, Path=ActualWidth}">
      <TextBox TextWrapping="Wrap" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </Grid>
</Viewbox>

это растянет вас текстовое поле, но отключит ожидаемое поведениеиз окна просмотра.Зачем?Мы сказали ViewBox сохранить соотношение сторон и установить текстовое поле, чтобы заполнить всю ширину области просмотра, которая сохраняет размер текстового поля.

Второй:

будет добавитьвысота до сетки, взятая из метки, измененная с помощью scaletransform ее окна просмотра.

Этот вариант, который я не пробовал, но с использованием преобразователя значений.

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

1 голос
/ 04 января 2012

Если то, что вы хотите, не работает / не легко, то подделайте это:

    <TextBox GotFocus="TextBox_GotFocus" HorizontalAlignment="Stretch" BorderThickness="0" Grid.Column="1"/>
    <Viewbox HorizontalAlignment="Left" Stretch="Uniform" Grid.Column="1">
        <TextBox x:Name="NameTextBox" Width="50" TextWrapping="Wrap" Text="Text" BorderThickness="0"/>
    </Viewbox>

    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        NameTextBox.Focus();
        NameTextBox.SelectionStart = NameTextBox.Text.Length;
    }

По сути, происходит следующее: TextBox находится позади Viewbox, и когда задний TextBox получает фокус, он переключает фокус на Viewbox * TextBox. Это приведет к некоторому странному изменению размера, так как у вас есть сетка с относительными размерами. Вам нужно будет поиграться с размерами столбца / ширины сетки, пока не получите желаемый эффект.

...