Button
包含Grid
。结构如下:
<Button>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Viewbox Grid.Column="0">
<TextBlock></TextBlock>
</Viewbox>
<Viewbox Grid.Column="1">
<TextBlock></TextBlock>
</Viewbox>
</Grid>
</Button>
问题是TextBlock
的位置没有固定,所以你可以看到以下情况,当左边的文字变长时,网格线向右移动。如何使TextBlock
的位置固定在网格单元格内(因此无论文本长度如何,中间网格线都会保留)?
编辑:上面的XAML将按原样修复TextBlocks的位置,但是当Grid
在按钮内时不会起作用。银色按钮上带有蓝色背景的网格下面的图像:我们可以看到网格线随着文本的变化而变化(而比率保持不变?)主要是因为网格占据了按钮的不同区域。
所以猜猜我真正的问题是:如何让Grid
占据整个按钮? (如果网格保持固定,网格线也是如此。)
EDIT2:
下面是生成由上述XAML表示的Button,Grid,Viewbox,TextBlock结构的代码。此代码生成Button
s,如下所示,其中绿色Grid
不会延伸到整个蓝色Button
,其占用区域会根据其内容而有所不同。将网格属性设置为g.HorizontalAlignment = HorizontalAlignment.Stretch;
g.VerticalAlignment = VerticalAlignment.Stretch;
并不起作用。
Button b = new Button();
b.Background = Brushes.DeepSkyBlue;
Grid g = new Grid();
g.Name = "grid";
g.ShowGridLines = true;
g.Background = Brushes.LimeGreen;
g.HorizontalAlignment = HorizontalAlignment.Stretch;
g.VerticalAlignment = VerticalAlignment.Stretch;
//create columns
for (int i = 0; i < 2; i++)
{
int len = i == 0 ? 3 : 1;
ColumnDefinition cd = new ColumnDefinition();
cd.Width = new GridLength(len, GridUnitType.Star);
g.ColumnDefinitions.Add(cd);
}
//viewbox col 0
Viewbox vb = new Viewbox();
TextBlock tb1 = new TextBlock();
vb.Child = tb1;
Grid.SetRow(vb, 0);
Grid.SetColumn(vb, 0);
g.Children.Add(vb);
//viewbox col 1
Viewbox vb2 = new Viewbox();
TextBlock updown = new TextBlock();
vb2.Child = updown;
//specify the Marlett Font
updown.Style = (Style)Application.Current.FindResource("updownBlock");
Grid.SetRow(vb2, 0);
Grid.SetColumn(vb2, 1);
g.Children.Add(vb2);
//add grid to button
b.Content = g;
答案 0 :(得分:1)
这应该有帮助
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Viewbox Grid.Column="0">
<TextBlock></TextBlock>
</Viewbox>
<Viewbox Grid.Column="1">
<TextBlock></TextBlock>
</Viewbox>
</Grid>
使用此示例,网格将首先将所需空间分配给右列,然后将剩余空间分配给左列。
我还将行定义删除为1行,* height是grid
的默认值修改强>
为了分配基于空间的可用空间加权比例,您可以将星形值的权重定义为两列
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
在上面的示例中,网格会将左列渲染为右侧列的3倍,而右侧列将以总空间的1/4渲染。
修改强>
设置HorizontalContentAlignment="Stretch"
&amp;按钮上的VerticalContentAlignment="Stretch"
使得网格可以占据整个空间,默认情况下它是中心。
答案 1 :(得分:1)
设置Grid
&#39; s Button
而不是设置ContentAlignment
的对齐方式,而不是设置
b = new Button();
b.HorizontalContentAlignment = HorizontalAlignment.Stretch;
b.VerticalContentAlignment = VerticalAlignment.Stretch;
现在无论内容的长度如何,网格线都会停留:)
答案 2 :(得分:0)
您的ColumnDefinition宽度为3和*。 *表示所有可用空间,您的文本框或网格宽度似乎没有固定,因此很明显textbloxk的位置会发生变化。
您可以采取的步骤: 1.设置ColumnDefinition width =&#34; Auto&#34; 2.设置文本块的宽度和父网格
答案 3 :(得分:0)
Buttonobject.HorizontalContentAlignment = HorizontalAlignment.Stretch; Buttonobject.VerticalContentAlignment = VerticalAlignment.Stretch;
拉伸属性会使内容与按钮的网格对齐