如何阻止WPF网格自动插入子元素上的边距

时间:2012-10-10 14:45:48

标签: wpf grid visual-studio-2012 margin

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

<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 个答案:

答案 0 :(得分:4)

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

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

如果你在顶部抓住它,它将设置新的边距。 grab at the top

如果你抓住它(在线下)它将不会设置/改变边距。 grab at the bottom

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

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

如果网格中的所有项目都没有设置WidthMargin,那么最好的办法是在没有任何修改键的情况下调整列的大小(在VS2012中它不应该破坏布局在视觉上,它应该只添加不必要的MarginHeightWidth属性,然后在文档大纲窗口中多选所有元素并在属性视图点击设置为自动按钮。这将删除不必要的属性。

Set To Auto

答案 1 :(得分:1)

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

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

我看到它的方式 - XAML中的所有内容都应该自动缩放 - 你唯一需要设置一个绝对值的时候就是你绝对需要它的那个大小...即便如此它也可能更好它通过一种风格(例如标准按钮不需要缩放到整个应用程序的宽度 - 所以显式尺寸可以......),边距应始终用于设置项目的边距,而不是用于布局(设计师似乎认为这是正常的)

我使用设计图面作为参考 - 你也可以点击一个元素,XAML代码将同步到你点击的项目(大部分时间) - 但是为了上帝的爱,不要拖动任何东西或者你将进入一个受伤的世界!

答案 2 :(得分:0)

我在所有侧面的所有元素上设置了边距,如果它们被重置,我会再次设置它们。如果没有设置边距,XAML设计器也会同时插入边距和跨距,这会破坏所有内容。

答案 3 :(得分:0)

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

首先从顶部拖动,如下图所示:

enter image description here

留下鼠标并记下每列的列宽。

按Ctrl + Z进行撤消。

然后从XAML更改列宽。

现在,您将使您的色谱柱尺寸合适,并且不会为网格内的任何组件添加任何额外的边距或高度或宽度。

相关问题