2011-08-14 3 views
3

Я пытаюсь имитировать приложение Sticky Notes в Windows 7. В исходном приложении, если вы вводите текст в Sticky Note и текст становится слишком большим (по вертикали, как и в номере линий), чтобы поместиться в окне, окно автоматически расширяется вертикально, по одной строке за раз, чтобы было больше места. Другими словами, если в обычном текстовом поле появится вертикальная полоса прокрутки, и текст будет прокручиваться вниз (так что первая строка станет невидимой), в Sticky Notes текстовое поле будет расширяться достаточно точно, чтобы соответствовать тексту, чтобы не отображалась полоса прокрутки. Разумеется, полоса прокрутки все же появляется, когда вы вручную измените размер окна.Вертикально расширяйте текстовое поле автоматически, когда текст слишком длинный

Если у вас Windows 7, просто откройте приложение Sticky Notes и введите несколько строк в липкой ноте, пока она не увеличится.

Я пытаюсь имитировать этот эффект, но мне не повезло. Проблема заключается в том, что фактическое окно должно изменять размер, а не только текстовое поле (я не думаю, что WPF работает таким образом, что изменение размера дочернего элемента может «заставить» родительский элемент стать больше? По крайней мере, не для окна, правильно?).

Содержимое окна на данный момент таковы:

<Window Background="Transparent" BorderBrush="Transparent"> 
    <!-- Transparent border to draw dropshadow on --> 
    <Border Background="Transparent" BorderBrush="Transparent"> 
     <!-- Grid with UI elements --> 
     <Grid Margin="5" Background="Transparent"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="27" />  
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <!-- Stickynote header --> 
      <Border ... /> 

      <!-- Content --> 
      <Border Grid.Row="1"> 

       <TextBox Text="{Binding ContentText}" ... /> 

      </Border> 
     </Grid> 
    </Border> 
</Window> 

Кто-нибудь знает, как я могу добиться этого эффекта? Благодаря!

+0

Попробуйте установить ширину = «Авто» для текстового поля – sll

ответ

2

Попробуйте окно свойств SizeToContent="Height"

Образец

<Window ... 
     MaxHeight="500" 
     SizeToContent="Height"> 
    <Border Background="Transparent" BorderBrush="Transparent"> 
     <Grid Margin="5" Background="Transparent"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="27" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 
      <Border Grid.Row="1"> 
       <TextBox AcceptsReturn="True" MinHeight="100"/> 
      </Border> 
     </Grid> 
    </Border> 
</Window> 

Редактировать Чтобы использовать его с TransparentWindow вы вывешенные, добавьте transparentWindow.SizeToContent = SizeToContent.Manual в OnDragDelta (TransparentWindow.cs)

private static void OnDragDelta(object sender, DragDeltaEventArgs e) 
{ 
    TransparentWindow transparentWindow = (TransparentWindow)sender; 
    Thumb thumb = e.OriginalSource as Thumb; 
    transparentWindow.SizeToContent = SizeToContent.Manual; 
    if (thumb != null && transparentWindow.WindowState == WindowState.Normal) 
    { 
     //... 
    } 
} 
+0

Это похоже на работу, но есть большая проблема: теперь я не могу изменить размер окна вручную (по крайней мере, не вертикально). Кажется, что проблема с моим окном, я использую этот «прозрачный» изменяемый размерный оконный код без полей (мое окно наследует TransparentWindow): http://archive.msdn.microsoft.com/getwpfcodebywillhan/Release/ProjectReleases.aspx?ReleaseId= 1578 Он отлично работает с обычным окном, но по какой-то причине это настраиваемое изменчивое окно не будет работать. Это потому, что он может вручную установить свойство Height? У меня нет подсказки ... –

+1

Обновлен мой ответ. Для этого подкласса Window вам необходимо сбросить 'SizeToContent' на' Manual' при изменении размера. Попробуйте и дайте мне знать, даст ли он желаемый результат. –

+0

Спасибо, похоже, что он может работать. Я не могу проверить его до сегодняшнего дня, я дам вам знать. –

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