文本太长时自动垂直展开文本框

时间:2011-08-14 13:40:56

标签: wpf textbox resize

我正在尝试模仿Windows 7中的Sticky Notes应用程序。在原始应用程序中,如果您在粘滞便笺中键入文本并且文本变得太大(垂直,如行数)以适合窗口,窗口自动垂直扩展,一次一行,以留出更多空间。换句话说,在普通文本框中会出现一个垂直滚动条,文本会向下滚动(这样第一行变得不可见),在粘滞便笺中,文本框的扩展范围足以适合文本,因此不会出现滚动条。当然,当您手动调整窗口大小时,滚动条仍然会出现。

如果你有Windows 7,只需打开Sticky Notes应用程序,然后在便利贴中输入几行直到它放大。

我试图模仿这种效果,但我没有运气。问题似乎是实际的窗口应该调整大小,而不仅仅是文本框(我不认为WPF以这种方式工作,子元素的大小调整可以'强制'父元素变大?至少不适用于Window,右?)。

此时窗口的内容如下:

<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>

有人知道我怎么能达到这个效果吗?谢谢!

1 个答案:

答案 0 :(得分: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)
    {
        //...
    }
}