【问题标题】:How do you do relative positioning in WPF?你如何在WPF中进行相对定位?
【发布时间】:2010-09-14 13:31:40
【问题描述】:

如何在 WPF 中相对定位元素? 标准模型是对所有内容都使用布局管理器,但是如果您只想根据其他元素的位置来定位元素(例如在 Canvas 上)怎么办?

例如,您可能希望将一个元素(例如按钮)附加到另一个元素(可能是面板)的一侧,而与该面板的位置或布局无关。 任何使用过工程工具(SolidWorks、AutoCad 等)的人都熟悉这种相对定位。

将所有内容强制放入布局管理器(不同的 WPF 面板)对于某些场景没有多大意义,在这些场景中,您不关心元素由某个父容器维护,并且您不希望其他子容器受到改变彼此的布局/外观。 WPF 是否以任何方式支持这种相对定位模型?

【问题讨论】:

  • 我不确定我是否完全理解这个问题。您能否举一个您认为 WPF 模型无法实现的屏幕布局示例?
  • 我同意,这个问题令人困惑......似乎一个简单的 StackPanel 就可以解决问题。
  • 我认为这不会令人困惑,而且 StackPanel 只能处理最简单的情况。他想要的是相当于Android中的RelativeLayout。
  • 就是这样(Android的RelativeLayout)。似乎 WPF 不支持这种布局方案。我发现的最佳解决方法是将 Canvas 包裹在您想要相对定位的任何 UI 元素周围,然后使用 Canvas.Top/Bottom/Left/Right 将元素相对于画布的边界放置(因此包裹元素)。

标签: wpf css-position


【解决方案1】:

好问题。据我所知,我们需要有一个不同的自定义面板来获得这个功能。由于 WPF 基于 Visual Hierarchy,因此无法为平台中的元素提供这种平面结构。

但这里有一个技巧。 将元素放置在相同位置并使用 RenderTransform.TranslateTransform 进行相对位移。这样,您的 TranslateTransfrom 的 X 和 Y 将始终与其他元素相关。

【讨论】:

  • “WPF 是基于 Visual Hierarchy 的,没有办法” - 自 WPF 的第一个版本以来,这一直是错误的。参考Grid
  • @Gusdor 是的,如果您使用拖放设计器,它只会拍打 Grid 内的所有内容(或任何您的根元素)并给它们留出边距以保持它们在放置位置的位置.我认为你可以称之为平面视觉结构。
【解决方案2】:

您可以在画布上放置一个堆栈面板,水平对齐,然后将两个按钮放在那里,而不是(如您的示例中)直接在画布上放置一个按钮。

像这样:

<Canvas>
  <StackPanel Canvas.Left="100" Canvas.Top="100" Orientation="Horizontal">
    <Button>Button 1</Button><Button>Button 2</Button>
  </StackPanel>
</Canvas>

我认为当您在一个表单中使用多个布局时它非常灵活,并且您可以创建几乎任何您想要的配置。

【讨论】:

  • 我想将此建议与 Jobi Joy 的建议结合起来是一种解决方法:您可以将 Stackpanel 放在 Canvas 中并使用 TranslateTransform 来调整元素之间的距离。
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多