WPF - Как остановить TextBox от автоматического изменения размера? - PullRequest
9 голосов
/ 17 декабря 2010

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

  • Window
    • Grid
      • ListBox
        • ItemTemplate
          • DataTemplate
            • Grid
              • Grid
                • Textbox ...
Текстовое поле определяется как ..
<TextBox Height="Auto" 
         Text="{Binding Path=LyricsForDisplay}" 
         MinHeight="50" 
         MaxHeight="400"  
         Visibility="Visible" 
         VerticalScrollBarVisibility="Auto" 
         IsReadOnly="True" 
         AllowDrop="False" 
         TextWrapping="WrapWithOverflow">
</TextBox>

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

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

Кто-нибудь знает, как получить функционал?

Ответы [ 5 ]

9 голосов
/ 17 декабря 2010

работают следующие работы:

<ListBox Name="ListBox1"
            ScrollViewer.HorizontalScrollBarVisibility="Disabled">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid>
                    <TextBox TextWrapping="Wrap"></TextBox>
                </Grid>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Обратите внимание на использование ScrollViewer.HorizontalScrollBarVisibility="Disabled" и TextWrapping="Wrap".

5 голосов
/ 17 декабря 2010

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

<ListBox HorizontalScrollBarVisibility="Disabled"
4 голосов
/ 21 февраля 2017

К сожалению, обычный TextBox не позволяет автоматически изменять размер, чтобы соответствовать родительскому, но НЕ автоматически изменять размер, когда текст не подходит.

Чтобы решить эту проблему, вы можете использовать пользовательский TextBox, который сообщает желаемый (0, 0) размер. Это ужасный хак, но он работает.

В вашем файле .xaml.cs:

public class TextBoxThatDoesntResizeWithText : TextBox
{
    protected override Size MeasureOverride(Size constraint)
    {
        return new Size(0, 0);
    }
}

Затем в вашем файле .xaml:

<Window x:Class="YourNamespace.YourWindow"
    ...
    xmlns:local="clr-namespace:YourNamespace">
        ...
        <local:TextBoxThatDoesntResizeWithText Height="Auto" 
                                               Text="{Binding Path=LyricsForDisplay}" 
                                               MinHeight="50" 
                                               MaxHeight="400"  
                                               Visibility="Visible" 
                                               VerticalScrollBarVisibility="Auto" 
                                               IsReadOnly="True" 
                                               AllowDrop="False" 
                                               TextWrapping="WrapWithOverflow">
        </local:TextBoxThatDoesntResizeWithText>
        ...
</Window>
1 голос
/ 20 мая 2016

два изменения кода:
1 - добавьте тег границы с нужным вам размером grid.column и grid.row.
2 - ширина и высота текстового поля, установленного на него.
образец:

 <Border x:Name="b" Margin="5"/>


  <TextBox Height="Auto" 
             Text="{Binding Path=LyricsForDisplay}" 
             MinHeight="50" 
             Width="{Binding ActualWidth, ElementName=b}" 
             Height="{Binding ActualHeight, ElementName=b}" 
             Visibility="Visible" 
             VerticalScrollBarVisibility="Auto" 
             IsReadOnly="True" 
             AllowDrop="False" 
             TextWrapping="Wrap">
    </TextBox>
0 голосов
/ 17 декабря 2010

Попробуйте установить свойство MaxWidth в текстовом поле

<TextBox Height="Auto" Text="{Binding Path=LyricsForDisplay}" MinHeight="50" MaxHeight="400"  Visibility="Visible" VerticalScrollBarVisibility="Auto" MaxWidth="100" IsReadOnly="True" AllowDrop="False" TextWrapping="WrapWithOverflow">                            </TextBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...