Изменение размера MessageBox в зависимости от размера текстовой строки

Привет, я пытаюсь реализовать изменение размера MessageBox в зависимости от размера строки текста (не заголовка) в пользовательском диалоговом окне, которое я создаю в WPF. Это мой пользовательский MessageBox с макетом моего приложения.

Но как MessageBox в зависимости от размера строки автоматически увеличивает высоту MessageBox? Как это сделать?

Заранее спасибо!


person Miguel    schedule 16.04.2011    source источник


Ответы (2)


Вот как я обычно это делаю:

<Window SizeToContent="WidthAndHeight" ResizeMode="NoResize" ...>

Кроме того, вы можете иметь ScrollViewer в качестве дочернего элемента окна и установить свойства MaxHeight и MaxWidth в окне, чтобы ограничить его еще больше.

Редактировать. Чтобы дать незаметный пример того, как может выглядеть окно:

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  SizeToContent="WidthAndHeight"
  ResizeMode="NoResize" MaxWidth="400" MaxHeight="400">
  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.Children>
          <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
            <FlowDocument>
                <Paragraph>
                    <Run Text="{Binding DisplayText}"/>
                </Paragraph>
            </FlowDocument>
          </FlowDocumentScrollViewer>

          <StackPanel Grid.Row="1">
            <!-- Buttons -->
          </StackPanel>
    </Grid.Children>
  </Grid>
</Window>
person H.B.    schedule 16.04.2011
comment
Это полезно в окне, и это то, что мне нужно для окна. Но какой элемент управления я использую для отображения текста? Мне нужен элемент управления, который автоматически увеличивается в зависимости от длины текста. И если текстовое поле делает это, и я не знаю, как это сделать. Если я хочу, чтобы TexBox не увеличивался по ширине, мне нужно только использовать свойство TextWrapping. А если я хочу, чтобы она росла в высоту? Я понятия не имею, какой элемент управления используется в MessageBox для отображения текста... - person Miguel; 16.04.2011
comment
Вы можете создать Page в качестве содержимого окна с FlowDocument в нем, а затем просто использовать все виды блоков и встроенных строк для отображения текста. Если вы хотите, чтобы текст переносился, вам нужно установить MaxWidth для контейнера, в противном случае он просто увеличивается в ширину (обычно до тех пор, пока окно не станет таким же широким, как экран). - person H.B.; 16.04.2011
comment
На самом деле FlowDocumentScrollViewer может быть более подходящим для простого окна сообщения, я добавил еще несколько примеров кода. - person H.B.; 16.04.2011
comment
Но может ли FlowDocumentScrollViewer вырасти до определенного предела (MaxHeight), как это делает обычный MessageBox? - person Miguel; 17.04.2011
comment
Вы можете установить MaxHeight для любого элемента фреймворка, включая FlowDocumentScrollViewer, если хотите. - person H.B.; 17.04.2011
comment
Я знаю это. Я спрашиваю, могу ли я поместить некоторый текст в элемент управления, и если он слишком большой, пусть он автоматически увеличивается в зависимости от длины текста (но когда достигает MaxHeight, автоматически появляется полоса прокрутки). Возможно ли это с помощью FlowDocumentScrollViewer? - person Miguel; 17.04.2011
comment
Конечно, это возможно, просто возьмитесь за дело и используйте его. - person H.B.; 17.04.2011

В WPF для точной настройки текста обычно используется класс FormattedText.

Что вам нужно, если я правильно понял, так это метод BuildGeometry:

http://msdn.microsoft.com/en-us/library/system.windows.media.formattedtext.buildgeometry.aspx

Итак, вам нужно:

  • Создайте форматированный текст
  • Постройте из него геометрию.
  • Извлечь ограничивающую рамку
  • Измените размер вашего окна сообщений на этот размер окна
person Marino Šimić    schedule 16.04.2011