我在WPF中有一个TextBlock。我在上面写了很多行,远远超过了它的垂直高度。我希望垂直滚动条在发生这种情况时会自动出现,但事实并非如此。我尝试在“属性”窗格中查找滚动条属性,但找不到一个滚动条属性。

一旦内容超出其高度,如何为TextBlock自动创建垂直滚动条? >
澄清:我宁愿由设计人员来做,也不要直接写XAML。

评论

重新阅读此问题后,我注意到您提到两次TextBlock和一次TextBox。

#1 楼

将其包装在滚动查看器中:

<ScrollViewer>
    <TextBlock />
</ScrollViewer>


注意此答案适用于原始问题中要求的TextBlock(只读文本元素)。

如果要在TextBox(可编辑的文本元素)中显示滚动条,请使用ScrollViewer附加的属性:

<TextBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ScrollViewer.VerticalScrollBarVisibility="Auto" />


这两个的有效值属性是DisabledAutoHiddenVisible

评论


我应该如何从设计师那里做?

–巴布·五谷(Bab Yogoo)
09年7月28日在7:19

抱歉,我不确定,我没有使用WPF设计器。我认为,如果直接添加XAML,设计器将自行更新。

–德鲁·诺克斯(Drew Noakes)
09年7月28日在8:04

@conqenator TextBox.ScrollToEnd();

–贝蒂B
2011-2-4在18:51

@Greg,问题是关于TextBlock而不是TextBox。

–德鲁·诺克斯(Drew Noakes)
2011-3-25在12:46

有时,如果封闭元素没有强制任何高度,则需要Scrollviewer上的MaxHeight来强制scoll出现。

– HackerBaloo
17年2月7日在16:48

#2 楼

现在可以使用以下内容:

<TextBox Name="myTextBox" 
         ScrollViewer.HorizontalScrollBarVisibility="Auto"
         ScrollViewer.VerticalScrollBarVisibility="Auto"
         ScrollViewer.CanContentScroll="True">SOME TEXT
</TextBox>


评论


@jjnguy,我将最初的问题解释为与TextBlock有关,而不是与TextBox有关(如标题和开头所示),但是第二段提到了TextBox。明确地说,这个答案绝对是文本框的最佳方法,而我的答案是我所知道的文本框的最佳方法:

–德鲁·诺克斯(Drew Noakes)
2011-03-25 12:47



@Drew,啊,很有道理。感谢您的澄清。

– jjnguy
2011-3-25 13:37

对我来说也更好。至少对于一个TextBox,当在其周围使用ScrollViewer时,就像在接受的答案中一样,TextBox的边框消失了,因为整个控件都滚动了,而不仅是滚动了它的内容。


2012年1月19日在16:43

#3 楼

更好的方法是:

<Grid Width="Your-specified-value" >
    <ScrollViewer>
         <TextBlock Width="Auto" TextWrapping="Wrap" />
    </ScrollViewer>
</Grid>


这样可以确保文本块中的文本不会溢出,并且与文本块下面的元素重叠(如果不这样做,可能会发生这种情况)使用网格。当我尝试其他解决方案时,即使文本块已经与其他元素并入了网格,这也发生在我身上。请记住,文本块的宽度应为“自动”,并且应在Grid元素中指定所需的宽度。我在代码中做到了这一点,并且效果很好。
HTH。

#4 楼

<ScrollViewer Height="239" VerticalScrollBarVisibility="Auto">
    <TextBox AcceptsReturn="True" TextWrapping="Wrap" LineHeight="10" />
</ScrollViewer>


这是在XAML中使用滚动文本框并将其用作文本区域的方法。

评论


这个问题与TextBlock有关,而不与TextBox有关。

– Afzaal Ahmad Zeeshan
14年6月21日在10:11

答案不太正确,但是我发现VerticalScrollBarVisibility是一个有用的提示,因此+1

–玛拉基
2014-09-17 23:23

#5 楼

<ScrollViewer MaxHeight="50"  
              Width="Auto" 
              HorizontalScrollBarVisibility="Disabled"
              VerticalScrollBarVisibility="Auto">
     <TextBlock Text="{Binding Path=}" 
                Style="{StaticResource TextStyle_Data}" 
                TextWrapping="Wrap" />
</ScrollViewer>


我通过将MaxHeight放在ScrollViewer中以另一种方式进行操作。容易。

#6 楼

此答案描述了使用MVVM的解决方案。

如果要向窗口添加日志记录框,则此解决方案非常有用,每次添加新的日志记录消息时,该窗口都会自动滚动到底部。 >
一旦添加了这些附加属性,便可以在任何地方重用它们,因此可以实现非常模块化和可重用的软件。 br />
添加此附加属性:

<TextBox IsReadOnly="True"   
         Foreground="Gainsboro"                           
         FontSize="13" 
         ScrollViewer.HorizontalScrollBarVisibility="Auto"
         ScrollViewer.VerticalScrollBarVisibility="Auto"
         ScrollViewer.CanContentScroll="True"
         attachedBehaviors:TextBoxApppendBehaviors.AppendText="{Binding LogBoxViewModel.AttachedPropertyAppend}"                                       
         attachedBehaviors:TextBoxClearBehavior.TextBoxClear="{Binding LogBoxViewModel.AttachedPropertyClear}"                                    
         TextWrapping="Wrap">


此附加属性(清除框):

public static class TextBoxApppendBehaviors
{
    #region AppendText Attached Property
    public static readonly DependencyProperty AppendTextProperty =
        DependencyProperty.RegisterAttached(
            "AppendText",
            typeof (string),
            typeof (TextBoxApppendBehaviors),
            new UIPropertyMetadata(null, OnAppendTextChanged));

    public static string GetAppendText(TextBox textBox)
    {
        return (string)textBox.GetValue(AppendTextProperty);
    }

    public static void SetAppendText(
        TextBox textBox,
        string value)
    {
        textBox.SetValue(AppendTextProperty, value);
    }

    private static void OnAppendTextChanged(
        DependencyObject d,
        DependencyPropertyChangedEventArgs args)
    {
        if (args.NewValue == null)
        {
            return;
        }

        string toAppend = args.NewValue.ToString();

        if (toAppend == "")
        {
            return;
        }

        TextBox textBox = d as TextBox;
        textBox?.AppendText(toAppend);
        textBox?.ScrollToEnd();
    }
    #endregion
}


然后,如果您使用的是MEF之类的依赖项注入框架,则可以将所有特定于日志记录的代码放入自己的ViewModel中:


这是它的工作方式:


ViewModel切换附加属性以控制TextBox。
由于使用了“附加”,因此闪电般快速。 >其他任何ViewModel都可以通过调用记录ViewModel上的方法来生成记录消息。
当我们使用Scro时llViewer内置在TextBox中,每次添加新消息时,我们可以使其自动滚动到文本框底部。


#7 楼

您可以使用

ScrollViewer.HorizontalScrollBarVisibility="Visible"
ScrollViewer.VerticalScrollBarVisibility="Visible"


这些是wpf的附加属性。
有关更多信息

http://wpfbugs.blogspot。 in / 2014/02 / wpf-layout-controls-scrollviewer.html

#8 楼

我试图使这些建议适用于文本块,但无法使其起作用。我什至试图让设计师使用它。 (在“布局”中,通过单击底部的向下箭头“ V”展开列表),我尝试将滚动查看器设置为“可见”,然后设置为“自动”,但仍然无法正常工作。

我最终放弃了,将TextBlock更改为具有Readonly属性集的TextBox,它的工作就像一个魅力。

#9 楼

不知道是否有人遇到了这个问题,但是将我的TextBlock包裹到了ScrollViewer中,以某种方式弄乱了我的用户界面-作为一个简单的解决方法,我发现用这样的TextBlock代替TextBox

<TextBox  Name="textBlock" SelectionBrush="Transparent" Cursor="Arrow" IsReadOnly="True" Text="My Text" VerticalScrollBarVisibility="Auto">


创建一个TextBox,其外观和行为类似于带有滚动条的TextBlock(您可以在设计器中全部完成)。

#10 楼

这是对该问题的简单解决方案。仅当文本溢出时,才会激活垂直滚动。

<TextBox Text="Try typing some text here " ScrollViewer.VerticalScrollBarVisibility="Auto" TextWrapping="WrapWithOverflow" />