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

标签 wpf silverlight graphics layout zooming

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

布局的哪些功能以及所使用的自定义控件的哪些功能使布局固定且无法进行平移和缩放?

最佳答案

一般规则

除了少数异常(exception),WPF 中的所有内容都可以根据您的喜好进行平移、缩放、旋转、拉伸(stretch)等。这包括像 Button 这样的单一控件、像 ListBox 这样的复合控件以及像 StackPanel 这样的容器。

异常(exception)情况

以下是异常(exception)情况:

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

  2. 如果您使用 Popup,它将显示在其 PlacementTarget 的平移/缩放位置,但它本身不会缩放。当您平移包含其 PlacementTarget 的区域时,它也不会移动(基本上它位于目标控件上方的自己的表面中)。为了解决这个问题,当您希望在缩放/平移区域内弹出某些内容时,请使用具有高 Z 顺序的零尺寸 Canvas 。

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

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

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

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

最终注释

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

  • 实现平移/缩放功能的简单方法是调整平移/缩放区域中最外层控件的 RenderTransform。有许多不同的方法来实现平移和缩放控件,例如,您可以使用工具栏按钮和 slider 、滚动条、鼠标滚轮、空格键+拖动进行平移、平移 UI 本身的可拖动区域或这些的任意组合。无论您选择哪个接口(interface),只需让它从代码隐藏中适本地更新 RenderTransform 即可。

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

  • 确保在平移/缩放区域上设置剪辑。否则,如果您放大或平移侧面的项目,它们在平移/缩放区域之外仍然可见。

关于WPF 和 Silverlight 控件和布局平移和缩放功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2060133/

相关文章:

c# - WPF应用程序在并发环境中被PropertyChangedEventManager挂起

c# - 仅在 XAML 中将装饰器放置在数据模板上?

c# - Silverlight:如何使用 Webclient 异步模式将数据从请求传递到响应?

c# - 将 UTC DateTime 转换为 Xaml 中的本地时区?

java - 如何修改lwjgl默认绘图颜色

c - C图形:如何在屏幕上绘制x-y轴?

c# - 为什么我的命名 WPF 形状无法从代码隐藏中访问?

silverlight - 如何从 Silverlight 4 中的 DataForm.Validating() 事件中删除一个或多个字段?

c# - 如何从 StreamGeometry 中提取 Point 对象?

wpf - TreeView SelectedItem 返回类型