WPF修复Button内的网格位置

时间:2014-10-16 03:53:22

标签: c# wpf

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的位置固定在网格单元格内(因此无论文本长度如何,中间网格线都会保留)?

enter image description here


编辑:上面的XAML将按原样修复TextBlocks的位置,但是当Grid在按钮内时不会起作用。银色按钮上带有蓝色背景的网格下面的图像:我们可以看到网格线随着文本的变化而变化(而比率保持不变?)主要是因为网格占据了按钮的不同区域。

所以猜猜我真正的问题是:如何让Grid占据整个按钮? (如果网格保持固定,网格线也是如此。)

enter image description here enter image description here


EDIT2: 下面是生成由上述XAML表示的Button,Grid,Viewbox,TextBlock结构的代码。此代码生成Button s,如下所示,其中绿色Grid不会延伸到整个蓝色Button,其占用区域会根据其内容而有所不同。将网格属性设置为g.HorizontalAlignment = HorizontalAlignment.Stretch; g.VerticalAlignment = VerticalAlignment.Stretch;并不起作用。

enter image description here

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;

4 个答案:

答案 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;

现在无论内容的长度如何,网格线都会停留:)

enter image description here

答案 2 :(得分:0)

您的ColumnDefinition宽度为3和*。 *表示所有可用空间,您的文本框或网格宽度似乎没有固定,因此很明显textbloxk的位置会发生变化。

您可以采取的步骤: 1.设置ColumnDefinition width =&#34; Auto&#34; 2.设置文本块的宽度和父网格

答案 3 :(得分:0)

Buttonobject.Horizo​​ntalContentAlignment = Horizo​​ntalAlignment.Stretch; Buttonobject.VerticalContentAlignment = VerticalAlignment.Stretch;

拉伸属性会使内容与按钮的网格对齐