【问题标题】:XY coordinates of WPF button move on runtime?WPF按钮的XY坐标在运行时移动?
【发布时间】:2013-03-12 13:11:49
【问题描述】:

我的 WPF 应用程序出现了一个非常奇怪的行为:我的按钮在运行时的 XY 位置似乎与我在 Visual Studio 的 xaml 编辑器中设置时的位置不同(顺便说一句,它有名称吗?)

它周围没有设置对齐或面板,我只设置了边距。我的按钮有以下代码:

<Button Content="OK" Height="23" Margin="213,319,4,7" Name="button3" Width="75" IsCancel="True" Click="button3_Click" IsEnabled="False" />

编辑:

边距是固定的,因为它是一个不可调整大小的对话框。如您所见,按钮略微向左和向上移动:

xaml 编辑器:

运行时:

为什么会这样,我该如何解决?

【问题讨论】:

  • 发散怎么办?周围的标签是什么?无论如何都应避免使用边距定位。
  • 这里有同样的问题,你想说什么发散......当你什么都不做或调整窗口大小时按钮会移动......等等......@HenkHolterman,为什么不定位与保证金?什么是替代方案? (或者你想说尺寸不应该通过边距来完成?那么我完全同意你的观点:))...顺便说一句,上面的代码设置了边距 尺寸,所以其中之一无论如何,设置肯定会被忽略,尤其是在调整窗口大小时...
  • 发布(完整)XAML。这也是关于周围的网格。
  • @ArnoSaxena - 使用边距是设计师所做的,但它很糟糕。而且从来没有必要。图片中的布局可以/应该使用简单的网格来完成。
  • 我认为您在理解 WPF 容器方面存在问题。我认为您最好使用VerticalAlignmentsHorizontalAlignments 而不是那个边距。您能否粘贴所有带有按钮、容器、列表的 XAML ......?帮你改正会更容易。

标签: c# wpf wpf-positioning


【解决方案1】:

我想下面关于对齐、边距和填充概述的链接将帮助您了解它是如何工作的?

另外放置一个面板包装器,例如 Stackpanel、Wrappand 或 Grid。适合做控件的布局

编辑:问题出在 ResizeMode="NoResize" 上。如果你在 Window 标签中移除这个属性,那么对齐会很好

Link to Refer

【讨论】:

  • 我想我已经理解了关于对齐、边距和填充的概念。我只是想知道,为什么我的元素甚至会移动,尽管我的窗口没有随时调整大小。告诉我,为什么它要改变它的 XY 位置呢?
  • 我看不到你的图片。你能纠正那个吗?那我来帮你
  • 在我的连接中它被阻止了。我怀疑horizo​​ntanalignment 属性。你可以设置为左并检查一次吗?
  • 设置了HorizontalAlignment="Left",没有解决问题(abload.de/img/12_03_2013_3zrus7.png)..
【解决方案2】:

伙计,这是在 WPF 中设置 UI 元素位置的最糟糕的方法!

将您的 XAML 重构为如下内容:

  <Grid Margin="5">
    <Grid.RowDefinitions>
      <RowDefinition Height="*"/>
      <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <ListView Grid.Row="0" Name="TableList" Margin="5"/>

    <Button Grid.Row="1" Name="button3" Content="OK"
            Margin="5"
            Width="75"
            HorizontalAlignment="Right"/>
  </Grid>

你看到了吗?有一个 Grid 处理其所有子项的位置(在本例中为 ListViewButton)。

Button 放在第二个 Row 上,向右对齐(@9​​87654327@ 属性)。

Grid 及其子代都有Margin=5。这保证了每个孩子的边距对于 aiacent 孩子和Grid 之外的其他控件是平等的。

另外,ListViewButton 完全对齐。

你的方法的问题是你设置了ButtonWidth它的Left Margin它的Right Margin。也许总数不正确,因为Window 的边框吃掉了一些像素,或者只是 WPF 无法同时处理所有信息而错过了计算,谁知道呢,但结果是 你必须至少离开一个参数免费。在我的示例中,我从 Window 中释放了 MarginsMargin=5 仅设置相对于其他控件的 Margin,但 ButtonWindow 的左边界的距离是我留给 WPF 图形引擎计算的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2018-01-10
    • 2022-01-09
    相关资源
    最近更新 更多