WPF和Silverlight控件和布局平移和缩放功能

rem*_*rem 6 silverlight wpf graphics layout zoom

我想了解WPF/Silverlight布局的一般要求,以便实现平移和缩放(拖动和缩放)功能.我不是指图像的平移和缩放,而是指具有某些控件的整个页面(窗口)布局(或部分).

布局的哪些功能以及使用的自定义控件的哪些功能使布局固定,平移和缩放不可能?

Ray*_*rns 9

一般规则

除了少数例外,WPF中的所有内容都可以平移,缩放,旋转,拉伸等等.这包括单个控件,如Button,复合控件(如ListBox)和容器(如StackPanel).

例外

以下是例外情况:

  1. 如果您使用的是Adorner且AdornerDecorator位于平移/缩放区域之外,则平移/缩放区域附带的装配器将平移但不会缩放.解决方案是在平移/缩放区域内放置一个额外的AdornerDecorator.

  2. 如果使用弹出窗口,它将显示在其PlacementTarget的平移/缩放位置,但它本身不会缩放.当您平移包含其PlacementTarget的区域时,它也不会移动(基本上它位于目标控件上方的自己的表面中).要解决此问题,请在缩放/平移区域内弹出一些具有高Z顺序的零尺寸画布.

  3. 您定义的任何ContextMenu都将显示在弹出窗口内,因此即使您单击的区域放大或缩小,菜单项也将显示正常大小.由于上下文菜单的性质,这可能是理想的行为.如果没有,您可以将菜单项包装在ViewBox中,并将缩放与主区域的缩放相结合.

  4. 即使UI已平移或缩放,您的工具提示也会显示正常大小.与ContextMenu相同的解决方案.

  5. 如果您使用WinForms集成来集成传统的WinForms控件和UI,则在某些情况下它们将无法正确平移,缩放和剪辑.有一种先进的技术可以解决这个问题,在屏幕上实现WinForms控件,然后使用BitBlt或类似方法将图像作为图像复制到窗口中,并将鼠标点击和击键转发到屏幕外窗口.不过,这是很多工作.

  6. 如果您绕过WPF并直接使用GDI +或DirectX,或使用Win32 hWnds显示内容或UI,则该内容或UI将无法正确平移,缩放或剪切到窗口,除非您自己在界面代码中执行此操作.

最后的笔记

  • 一个好的WPF UI总是使用Grid,DockPanel等面板以灵活的方式布局控件,以便它们自动调整到容器大小,而不是使用固定的大小和位置.对于平移/缩放区域的内部内容也是如此,但是此规则有一个例外:平移/缩放区域中最外面的元素必须具有指定的大小.否则,什么将定义被平移/缩放的区域?

  • 实现平移/缩放功能的简便方法是调整平移/缩放区域中最外层控件的RenderTransform.有许多不同的方法来实现平移和缩放控件,例如,您可以使用工具栏按钮和滑块,滚动条,鼠标滚轮,空格键+拖动平移,平移UI本身的可拖动区域或这些的任意组合.无论您选择哪种界面,只需从代码隐藏中更新RenderTransform,您就可以开始使用了.

  • 如果您选择的平移机制是滚动条,您可能需要使用ScrollViewer并仅使用RenderTransform进行缩放.

  • 确保在平移/缩放区域设置剪裁.否则,如果放大或平移侧面的项目,它们仍将在平移/缩放区域外可见.