WPF,Silverlight与XAML读书笔记第三十三 可视化效果之布局内容溢出处理

说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。

    WPF内置面板控件会尽量满足子元素尺寸需求,但如果由于动态改变等原因面板提供的空间小于子元素所需的空间就会发生溢出问题。如一个ListBox控件包含许多项,无法在它的父面板中完全显示。

处理内容溢出策略有下面几种,将逐一介绍:

  • 剪辑 (clipping)
  • 滚屏 (scrolling)
  • 缩放 (scaling)
  • 换行 (wrapping)
  • 截断 (trimming)

剪辑

    剪辑子元素是面板处理那些过大的子元素的默认方式。剪辑发生在面板的边缘或面板内部。

    剪辑是可控制的,因为所有UIElement均有一个Boolean类型的ClipToBounds属性,来控制剪辑是否发生,也即子元素可否在边界外呈现。尽管所有面板都继承了ClipToBounds属性,但只有Canvas会使用此属性设置,其它面板无论此值的设置为何,都会在边缘剪辑内容。而形成鲜明对比的是Canvas的ClipToBounds属性默认值为false,即不会发生剪辑 。这样除非显式设置Canvas的ClipToBounds为True,否则其子元素的大小与Canvas几乎没有什么关系。

    控件也可以使用ClipToBounds对自己的内容进行剪辑,如Button有ClipToBounds属性,当设置为True时(默认值为False),就会对Button的内容(Button为内容控件)进行剪辑。

提示:

在Grid单元格内部,如果想要避免剪辑的发生,最佳的方法是增加相应单元格的RowSpan或ColumnSpan。

注意:

剪辑发生在RenderTransform生效之前!这样会发生的不被预期的结果是,当用ScaleTransform作为RenderTransform把元素变大时,即使变大后的元素会超越容器边界,但仍然不会发生剪辑(除非超过Window或Page的边缘)。同理,当用ScaleTransform作为RenderTransform缩小一个元素时,即使缩小后的元素可能小于容器,但如果原始大小大于容器仍会被剪辑。所以如果打算用RenderTransform缩放一个元素,应该考虑使用LayoutTransform来避免剪辑的影响。

滚屏

    对于大多数程序,滚屏都是一个很常见的特性。在WPF中实现滚屏很容易,只需把元素包装在一个System.Windows.Controls.ScrollViewer控件中,该元素即可支持滚屏。ScrollViewer利用了ScrollBar控件,其会把ScrollBar自动嵌入到需要支持滚动的内容中。

    ScrollViewer使用Content属性来设置需要滚屏的项,由于Content是ScrollViewer的内容属性,这样就可以把需要滚屏的内容作为ScrollViewer子元素来设置。另外需要滚屏的内容一般被放在一个面板(如StackPanel)中来设置给Content。

ScrollBar可以响应多种方式的输入:

  • 支持箭头键做微量的滚动
  • 支持翻页键做大跨度的滚动
  • 支持Ctrl+Home或Ctrl+End跳到开始或结束

ScrollBar有两个很重要的属性 – VerticalScrollingBarVisibility与HorizontalScrollBarVisibility,这两个属性均为ScrollBarVisibility类型,此枚举类型有如下4种定义:

  • Visible:ScrollBar总是可见的,无论是否需要,当不被需要时,会禁用外观,停止响应输入。
  • Auto:如果此方向内容过大而需要滚屏时,该ScrollBar可见。否则不可见。
  • Hidden:Scrollbar不可见,但其逻辑仍然在,内容仍然可以被滚动,各种输入也会得到响应。
  • Disabled:ScrollBar不可见,也不存在,内容只能显示父元素大小限制的那没多,也不会相应任何与滚动相关的输入。

VerticalScrollingBarVisibility的默认值为Visible,HorizontalScrollBarVisibility的默认值为Auto,这与大多数程序的滚动行为一致。

提示:

ListBox的默认可视树具有一个ScrollViewer,这样可以通过ListBox的附加属性设置ScrollViewer的VerticalScrollingBarVisibility与HorizontalScrollBarVisibility属性。代码如:

<ListBox ScrollViewer. HorizontalScrollBarVisibility="Disabled">

</ListBox>

缩放

缩放是WPF出现后开始流行的一种内容查看方式,相对于滚屏的方式,缩放一定情况下可以更便于从整体上查看内容。如Visual Studio 2010支持的代码缩放查看。WPF中ScaleTransform这个变换可以支持缩放特性。但要不另外编写代码就能使元素相对于可用空间来缩放,需要使用System.Windows.Controls.Viewbox所提供的机制,这种机制允许在给定空间中缩放任意内容。

Viewbox派生自System.Windows.Controls.Decorator,这与Border是相同的。这类元素是一类只有一个元素的面板类。默认设置下,Viewbox会来伸来填充父元素提供给它的空间。另外Viewbox使用Stretch属性来控制它的唯一子元素在它内部的缩放。这个属性为System.Windows.Media.Stretch枚举,有如下4种值:

  • None:不进行缩放,如同不使用Viewbox。
  • Fill:子元素的宽度与高度被设为与Viewbox宽度和高度相同的值,而不考虑子元素的宽度高度比。
  • Uniform(默认值):子元素在保持宽高比不变的同时放大到最大(或缩小到刚刚能放入Viewbox内),但整个元素仍会在Viewbox之内。这样如果子元素的宽高比与Viewbox的宽高比不一致,则Viewbox内某一方向上会留下未被填充的空间。
  • UniformToFill:在子元素保持宽高比不变的同时,将其缩放来完全填充Viewbox。同样,如果子元素的宽高比与Viewbox的宽高比不一致,则子元素内某一方向上会被截断。

Viewbox还有一个StrechDirection属性来控制是否需要缩小或放大内容,该属性是System.Windows.Controls.StretchDirection枚举型,几种值如下:

  • UpOnly:如果可以,扩大内容。否则保持当前内容大小不变。
  • DownOnly:如果可以,缩小内容。如果内容已足够小则保持当前内容大小不变。
  • Both(默认值):按上面Stretch属性的定义的要求来扩大或缩小内容。

换行

    针对内容做换行:一共有3种策略,分别内置于布局控件部分介绍过的WrapPanel,TabPanel和ToolBarOverflowPanel。

截断

    截断仅对TextBlock与AccessText控件的文本起作用。这两个控件均有一个类型为System.Windows.TextTrimming的TextTrimming属性,此属性有3种值:None(默认值),CharacterEllipsis与WordEllipsis。后两种属性设置会实现截断效果,且如果发生截断,截断文本后会被加上一个省略号。

本文完

参考:

《WPF揭秘》

原文地址:https://www.cnblogs.com/lsxqw2004/p/4629170.html