为什么 ScrollViewer 属性不影响标签(Label)?

3
我使用带有ScrollViewer属性的Label
<Label ScrollViewer.HorizontalScrollBarVisibility="Auto"
       ScrollViewer.VerticalScrollBarVisibility="Auto">
    Here is many many many text.
</Label>

但是没有滚动条出现。即使使用Visible而不是Auto也是如此。 这里出了什么问题?

标签的大小是否受到限制?例如,由像网格这样的容器限制吗?如果不是,我认为标签将简单地增大以适应文本。滚动条仅在标签无法再增大时才起作用。 - nvoigt
5个回答

5

你需要将ScrollViewer放在标签周围,它是一个单独的控件:

<ScrollViewer Width="50" Height="30" HorizontalScrollBarVisibility="Visible">
    <Label>
        Here is many many many text.
    </Label>
</ScrollViewer>

谢谢,这个有效。现在我想知道,为什么标签可以具有ScrollViewer属性,而它们根本不影响标签? - John Threepwood
我也不知道,我对那个很感兴趣。我知道你可以在WPF中的XAML中将ScrollViewer.VerticalScrollBarVisibility应用为任何属性,但是尝试在代码后台创建一个Label时,它不可用作要设置的属性。 - JMK
我认为它与Grid.RowGrid.Column相同,为了使它们生效,它们必须位于Grid布局容器内部。 - Carles Company

5
现在我想知道,为什么Label可以具有ScrollViewer属性,而这些属性却对Label没有影响?
ScrollViewer属性是附加属性。附加属性通常具有独立于它们所应用的元素的默认行为(例如,ToolTipService属性由服务处理,元素本身不需要知道任何内容),因此它们可以随时在任何地方设置。
这类似于每个控件上都有的BorderBrush属性。控件通常将该值传递给其模板中的Border元素。大多数控件模板包含一个Border,但许多模板不包含ScrollViewer。您可以编写一个包括它的Label模板。
<Window.Resources>
    <Style TargetType="Label">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Label">
                    <Border BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <ScrollViewer>
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              RecognizesAccessKey="True" />
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Label ScrollViewer.HorizontalScrollBarVisibility="Visible"
       ScrollViewer.VerticalScrollBarVisibility="Hidden"
       Content="text" />

请注意,即使我没有向ScrollViewer添加TemplateBinding,这个方法仍然有效。这是因为ScrollViewer知道它自己的附加属性,并且如果在模板内部,会默认添加绑定。
从模板中可以看出,标签实际上只是具有设置了RecognizesAccessKey的内容呈现器。这样用户就可以根据其文本使用Alt键盘快捷键。除此之外,Label还定义了一个Target属性,用于定义在按下键盘快捷键时应选择哪个元素。标签旨在成为输入元素旁边的简短描述性文本。在您的情况下(需要滚动的长文本显示),可能并不需要。事实上,您可以将文本内容直接放置在ScrollViewer中:
<ScrollViewer HorizontalScrollBarVisibility="Auto"
              VerticalScrollBarVisibility="Auto">
    Here is many many many text.
</ScrollViewer>

非常感谢您的详细解释! - John Threepwood

4

ScrollViewer附加属性用于控制在控件的Template中定义的ScrollViewer(首先想到的这样的控件是ListView)。在Label的模板中没有ScrollViewer,因此在标签上设置此属性没有任何效果。

相反,您应该像JMK所示那样简单地使用ScrollViewer包装您的Label


1

您需要将标签添加到ScrollViewer中,并提供一些高度和宽度

<ScrollViewer HorizontalScrollBarVisibility="Visible" Height="40" Width="40" >

   <Label>
      Content
   </Label>

</ScrollViewer>

0
你需要在标签周围放置ScrollViewer,例如:
<ScrollViewer HorizontalScrollBarVisibility="Visible">

   <Label/>

</ScrollViewer>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接