5

我在 Visual Studio 2012 和 WPF 上遇到了最烦人的问题,我希望能得到一些帮助。我有一个带有子元素的简单网格,比如 TextBlocks,以及网格的单元格。TextBlocks 被设置为在单元格内相对定位(例如,使用 Left 的 Horizo​​ntalAlignment)。一切都很好,直到我敢于调整网格的列或行的大小。然后,Visual Studio 插入 Margin 和 Width/Height 属性以与父/子元素的结果位置保持一致。这一切都在静默中发生,如果我决定进一步减小列的大小,直到后来我才注意到它,突然 TextBlock 被剪裁,因为它的 Margin 属性被插入。我必须遍历每个子元素并手动删除这些额外的属性。在我当前的项目中,我不得不这样做近 100 次,而且我在网上找不到任何东西来弄清楚如何告诉 Visual Studio 退出并停止采取这些窃取我试图实现的漂亮格式的自由. 这是一个供参考的代码片段。但这发生在我项目中许多不同的网格实例上。

<Grid  Canvas.Left="435" Canvas.Top="138" Height="61" Width="192">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="11*"/>
        <ColumnDefinition Width="21*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="0" Grid.Column="0" Text="Subtotal:" HorizontalAlignment="Right" VerticalAlignment="Center"  />
</Grid>

...在调整第 0 列的大小之后:

<TextBlock Grid.Row="0" Grid.Column="0" Text="Subtotal:" HorizontalAlignment="Right" VerticalAlignment="Center" Height="16" Margin="0,7" Width="47"  />

当然还有其他人遇到过这个问题。请帮忙!

谢谢

4

4 回答 4

4

对于 XAML 设计器中奇怪的自动行为,您无能为力。作为明智的通用词,您通常最好使用 XAML 文本编辑器而不是设计器来编辑您的 xaml。

幸运的是,在您的特殊情况下,有一个解决方案。该行为取决于您用鼠标准确抓取该列的位置:

如果您在顶部抓住它,它将设置新的边距。 抓住顶部

如果您在下方(在线)抓住它,它将不会设置/更改边距。 抓住底部

更新:此功能在 VS 2012 中不再存在。

您现在可以使用Ctrl和/或Shift键更改列调整大小的行为。但是没有一种行为会产生你所追求的结果。

如果网格中的所有项目都没有 aWidth和 aMargin集,最好的办法是在没有任何修饰键的情况下调整列的大小(在 VS2012 中,它不应该在视觉上破坏布局,它应该只添加不必要MarginHeightWidth属性)和然后在Document Outline窗口中多选所有元素并在Properties视图中单击Set To Auto按钮。这将删除不必要的属性。

设置为自动

于 2012-10-10T14:50:02.077 回答
2

简单的解决方案就是不要将设计图面用于视觉参考之外的任何东西。

我使用文本编辑器,否则您几乎无法控制 XAML - 我发现在设计表面上拖放控件会自动设置边距和对齐等非常烦人

我看到它的方式 - XAML 中的所有内容都应该自动缩放 - 唯一需要在某物上设置绝对值的时候是当你绝对需要它的大小时......即使那样,通过样式(例如,标准按钮不需要缩放到整个应用程序的宽度 - 所以明确的大小是可以的......),边距应该始终用于设置项目的边距,而不是用于布局(这是设计师似乎认为还可以)

我使用设计图面作为参考——你也可以单击一个元素,XAML 代码将同步到你单击的项目(大多数情况下)——但是看在上帝的份上,不要拖动任何东西,否则你会进入一个受伤的世界!

于 2012-10-10T15:20:23.083 回答
0

我为所有元素的所有边设置边距,如果它们被重置,我会再次设置它们。如果没有设置边距,XAML 设计器会同时插入边距和跨度,这会破坏一切。

于 2013-06-15T19:10:55.437 回答
0

我知道这个问题很老了。但我找到了适用于任何版本的 Visual Studio 的简单解决方案。我认为这对面临同样问题的其他人可能非常有用。

先从上往下拖,如下图:

在此处输入图像描述

离开鼠标并记下每列的列宽。

按 Ctrl+Z 撤消。

然后从 XAML 更改列宽。

现在您将获得适当大小的列,并且不会在网格内的任何组件中添加任何额外的边距或高度或宽度。

于 2013-12-12T16:07:13.743 回答