【发布时间】:2018-07-16 19:26:02
【问题描述】:
看例子:
<Grid VerticalAlignment="Top" Background="Yellow">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<TextBlock x:Name="textBlock"/>
<Button Grid.Column="1">
<Viewbox>
<Path Height="100" Width="100" Fill="Black" Data="M 0,0 H 100 V 100 H 0 Z" />
</Viewbox>
</Button>
</Grid>
这是一个带有矢量图形的按钮,我希望它尽可能小(限制矢量图形爆炸)。
这是它的外观和我想要的样子:
有几种可能的解决方案来克服这个问题,列举几个:
-
通过将
Width/Height绑定到其他元素(这与设计器有问题):... <Button Height="{Binding ActualHeight, ElementName=textBlock}" ...> ...这通常与ghost一起使用:其他人(与它没有关系)用来布置自己的特殊隐形元素。
-
通过在
Canvas(这是神奇的容器)中托管元素,但是Canvas本身需要布局。您可以尝试将
Button放入Canvas。这会导致父级Grid只占用TextBlock的高度,但是还有另一个问题:如何定位(布局)Canvas自身,使其子级布局正确,kek。
在上面的示例中,我实际上并不希望TextBlock 成为Button 的姐妹,它们可能会重叠(如果可用大小不可用,您不希望隐藏按钮够了,它应该重叠一些不太重要的东西),我只希望他们有相同的父母(如果它移动 - 孩子会移动)。使困惑?看这里:
<Grid>
<TextBlock ... />
<Button HorizontalAlignment="Right" ... />
</Grid>
这个布局有同样的问题,可以类似地解决。
现在试着从上面的具体例子中抽象出来。
我实际上想要的是:学习如何排除容器布局中的元素。就像元素被折叠一样,所以父容器会测量子元素的大小(除了这个元素),布局子元素,然后在布局完成后,元素突然变得可见并受到父容器的限制,同时可以使用各种对齐方式。
我问的有意义吗?也许自定义容器是这样的?还是我错过了一些现有的和明显的东西?
【问题讨论】: