WPF TextBox Wrapping - PullRequest
       15

WPF TextBox Wrapping

11 голосов
/ 20 октября 2011

Я пытаюсь выяснить, как получить текстовое поле для переноса его содержимого, однако ситуация не совсем такая же, как в типичном сценарии «он не переносит». Мое текстовое поле содержится внутри DataTemplate, которое используется внутри экземпляра Telerik RadTabControl (с помощью ContentTemplatePresenter, чтобы определить, какое представление следует отображать), и XAML для DataTemplate выглядит следующим образом:

<DataTemplate x:Key="NotesTemplate">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Text="Use the box below to record any general notes associated with this item." Style="{StaticResource Default}" />
        <TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" GridRow="1" Margin="20" Text="{Binding Notes, UpdateSourceTrigger=PropertyChanged}" />
     </Grid>
</DataTemplate>

Причина, по которой я говорю, что она не подпадает под нормальный сценарий "она не переносит", заключается в том, что она использовалась для переноса, пока мне не пришлось изменить представление, чтобы изменить его размер на что-либо, чтобы поддерживать изменяющиеся размеры экрана, которым будет приложение запускать на. Когда я сделал это, TextBox прекратил перенос, потому что (предположительно), когда пользователь вводит что-то, TextBox говорит: «Мне нужно больше места», поэтому родитель обязуется, и поле продолжается до бесконечности вправо (хотя представление получает полосы прокрутки). Я попытался установить MaxWidth с помощью Binding / RelativeSource, но, поскольку родительский элемент специально разработан для расширения, этот подход не будет работать. То, что мне нужно, чтобы это произошло, это поле должно иметь ширину «содержащих родителей» VisibleWidth . Это означает, что если само окно имеет размер 1024x768, то максимальная ширина TextBox должна составлять 1024, и любой текст после этого будет автоматически переноситься, но если размер окна увеличивается до 1280x1024, поле теперь должно быть 1280 и соответственно перенос текста. Я пробовал этот сценарий с этим обязательным выражением, но не повезло:

MaxWidth="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=ActualWidth}"

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

Есть идеи?

1 Ответ

16 голосов
/ 20 октября 2011

, хотя представление получает полосы прокрутки

Отключите горизонтальное представление прокрутки, поэтому оно будет принудительно перенесено.Вы можете попытаться отключить его на самом TextBox или на упаковке Grid.

<DataTemplate x:Key="NotesTemplate">
    <Grid ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Text="Use the box below to record any general notes associated with this item." Style="{StaticResource Default}" />
        <TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" Grid.Row="1" Margin="20" Text="{Binding Notes, UpdateSourceTrigger=PropertyChanged}" />
     </Grid>
</DataTemplate>
...