2014-01-09 2 views
0

У меня возникла проблема, когда я хочу, чтобы текстовые поля в моем приложении динамически изменяли размер с помощью окна, но не расширялись, когда пользователь вводит текст.Динамический размер TextBox, который не расширяется с помощью ввода?

Однако после поиска не будет видно, что существует общее решение для исправления всех текстовых полей приложения, кроме добавления привязок XAML для объектов MaxWidth и MaxHeight текстового поля.

Таким образом, я создал следующий контроль автоматически заблокировать текстовые поля размеры после Measure() вызова:

<TextBox x:Class="GUI.Views.Controls.FixedTextBox" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"> 
</TextBox> 

public partial class FixedTextBox : TextBox 
    { 
     public FixedTextBox() 
     { 
      InitializeComponent(); 
     } 

     protected override Size MeasureOverride(Size constraint) 
     { 
      UnboundDimensions(); 
      var measured = base.MeasureOverride(constraint); 
      BoundDimensions(); 
      return measured; 
     } 

     private void UnboundDimensions() 
     { 
      MaxWidth = Double.PositiveInfinity; 
      MaxHeight = Double.PositiveInfinity; 
     } 

     private void BoundDimensions() 
     { 
      MaxWidth = ActualWidth > 0 ? ActualWidth : Double.PositiveInfinity; 
      MaxHeight = ActualHeight > 0 ? ActualHeight : Double.PositiveInfinity; 
     } 
    } 

Это решение отлично работает, но мне было интересно, если есть, может быть, лучше, прежде чем я пройду через свой код XAML и изменю текстовые поля на свой пользовательский элемент управления ...?

Edit (Проблема Пример): https://dl.dropboxusercontent.com/u/28956841/TextBoxTrouble.zip

<Window x:Class="TextBoxTrouble.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="150" Width="500"> 

    <ScrollViewer HorizontalScrollBarVisibility="Auto" 
        VerticalScrollBarVisibility="Auto"> 
     <Grid Grid.IsSharedSizeScope="True"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition> 
       <ColumnDefinition></ColumnDefinition> 
       <ColumnDefinition Width="5"></ColumnDefinition> 
       <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition> 
       <ColumnDefinition Width="2*"></ColumnDefinition> 
      </Grid.ColumnDefinitions> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="40"></RowDefinition> 
       <RowDefinition></RowDefinition> 
      </Grid.RowDefinitions> 

      <Label Grid.Column="0" 
        Grid.Row="0" 
        VerticalContentAlignment="Center">Label 1</Label> 
      <TextBox Grid.Column="1" 
        Grid.Row="0" 
        Margin="10">Some text</TextBox> 

      <Label Grid.Column="3" 
        Grid.Row="0" 
        VerticalContentAlignment="Center">Label 2</Label> 
      <TextBox Grid.Column="4" 
        Grid.Row="0" 
        Grid.RowSpan="2" 
        Margin="10" 
        VerticalScrollBarVisibility="Auto" 
        HorizontalScrollBarVisibility="Disabled" 
        AcceptsReturn="True" 
        TextWrapping="Wrap">Some multiline text</TextBox> 
     </Grid> 
    </ScrollViewer> 
</Window> 
+1

Я не думаю, что у меня когда-либо была проблема, которую вы описываете. Можете ли вы опубликовать небольшую полную программу, демонстрирующую такое поведение, которое вы описываете? «MainWindow.xaml» и «.cs» будут в порядке. Я подозреваю, что проблема может быть у родителя «TextBox». – Steve

+0

Согласовано @Steve. У меня никогда не было автоматического расширения текстового поля для заполнения контента. Что-то еще происходит. Покажите нам свой файл xaml, как было задано. – Thraka

+0

Вот пример проблемы: https://dl.dropboxusercontent.com/u/28956841/TextBoxTrouble.zip –

ответ

1

Проблема в коде вы публикуемый (все, что было необходимо опубликовать для меня, чтобы найти вашу проблема была содержанием MainWindow.xaml) является то, что вам нужно для установки HorizontalScrollBarVisibility="Disabled" для вашего внешнего ScrollViewer.

<Window x:Class="TextBoxTrouble.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="150" Width="500"> 

    <ScrollViewer HorizontalScrollBarVisibility="Auto" <!-- THIS LINE --> 
        VerticalScrollBarVisibility="Auto"> 
+0

Посмотрите на пример, вам, вероятно, придется запускать его, потому что поведение не то, что я ожидал от XAML. Я думаю, что это как-то связано с использованием «Grid.IsSharedSizeScope» .... –

+0

См. Мое редактирование. Это довольно простое решение. – Steve

+0

Мне нужны полосы прокрутки в обоих направлениях грустно, иначе это было бы так просто, но проблема также в вертикальном направлении, представление это часть своего рода контейнера для размещения других видов, некоторые из которых довольно большие , –

Смежные вопросы