Silverlight Grid - 不适合其单元格的显示值

时间:2011-05-30 08:22:30

标签: silverlight silverlight-4.0

我知道我们可以使用ColumnSpan和RowSpan

向右或向下拉伸项目

然而,我得到了一个我希望在网格单元格中显示的项目,并根据此单元格中心对其进行居中,因此在文本的情况下,它将向右和向左两个,这里我提供了一个图像当前它看起来如何,“12345”文本不能适合列并显示为“234”,有没有办法使1& 5可见,所有列都保持不变?enter image description here

文本可以更改为任何内容并且必须正确居中,我可以通过这种方式破解显示12345的方法,但需要一个可以处理任何文本的解决方案,以防万一,textBlock grid.Column必须是保持不变1(或者2对于我的情况来说是精确的),对于这个图片情况不是0。

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解您对问题的限制,因此这些解决方案都不可行,但这里有两个快速建议。 (就个人而言,我更喜欢解决方案2。)

<Edit: Additional Thought>
解决方案0
如果您能够更改文本块的Grid.ColumnSpan,则可以在没有容器的情况下执行解决方案2。只需将文本块跨越几列,然后调整文本块的填充以使内容居中! </Edit>

解决方案1 ​​
首先,如果您当前的XAML结构如下所示:

<Grid>
    <TextBlock Grid.Column="2" Text="12345" />
</Grid>

考虑将其改为这样的东西吗?

<Grid>
    <!-- Draw up columns so that the textblock looks as you wish -->
    <TextBlock Grid.Column="2" Text="12345" />

    <!-- Span an inner grid across all the columns/rows in the outer grid -->
    <Grid Grid.ColumnSpan=".." 
          Grid.RowSpan="..">
        <!-- All the other stuff in the Grid -->
    </Grid>
</Grid>

解决方案2
如果这不起作用,请考虑将文本块放在另一个容器中,例如Label,并将其跨越列。

<Grid>
    <!-- Use the left/right padding on the label to center the textbox -->
    <sdk:Label Grid.Column="0"
               Grid.ColumnSpan="3"
               Grid.Row="1"
               HorizontalAlignment="Center"
               Padding="13,0,0,0">
        <!-- In my example, setting the left pading to 13 centered the textbox -->
        <TextBlock HorizontalAlignment="Center"
                   Text="......!......" />
        <!-- Text like the test above, really helped find the correct padding -->
    </sdk:Label>
</Grid>


我希望这可以在你的限制范围内工作,如果没有,可以帮助你自己找出解决方案!

答案 1 :(得分:1)

解决方案4
因此,如果我现在正确理解,那么实际想要的是一种将文本动态集中的方法。你不想自己想要填充填充物,你想要一个适用于所有东西的数字吗?我当然希望你欣赏这个! :)

/// <summary>
/// Takes a FrameworkElement that is spanned across
/// multiple columns and RETURNS a Thickness that
/// can be applied to the Padding property to
/// centre it across the spanned columns
/// </summary>
/// <param name="fe">The FrameworkElement to be centred</param>
/// <param name="centerColumn">The index of the desired centre column</param>
/// <returns>A Thickness that will center the FrameworkElement</returns>
private Thickness GetCenteringPadding(FrameworkElement fe, int centerColumn)
{
    Grid parentGrid = fe.Parent as Grid;
    if (parentGrid == null)
        throw new ArgumentException();

    // Variables
    int firstColumn = (int)fe.GetValue(Grid.ColumnProperty);
    int columnSpan = (int)fe.GetValue(Grid.ColumnSpanProperty);
    double totalWidth = 0.0;
    double leftWidth = 0.0;
    double leftPaddingWidth = 0.0;

    // Total the width for all the spanned columns
    for (int i = firstColumn; i < columnSpan + firstColumn; i++)
    {
        // This part can be dangerous, especially if you're using a '*'
        totalWidth += parentGrid.ColumnDefinitions[i].ActualWidth;
    }

    // Get the total width from the left side of the first
    //  spanned column, to the center of the 'centerColumn'
    for (int j = firstColumn; j <= centerColumn; j++)
    {
        if (j != centerColumn)
            leftWidth += parentGrid.ColumnDefinitions[j].ActualWidth;
        else // Only take half the width for the center column
            leftWidth += parentGrid.ColumnDefinitions[j].ActualWidth / 2;
    }

    // Calculate the padding width
    // (Abbr. rightWidth = tW - lW, lPW = lW - rW)
    leftPaddingWidth = 2*leftWidth - totalWidth;

    // Check whether the padding needs to be on the left or the right
    if (leftPaddingWidth > 0.0)
    {
        // The excess space is on the left
        return new Thickness(leftPaddingWidth, 0.0, 0.0, 0.0);
    }
    else
    {
        // The excess space is on the right
        return new Thickness(0.0, 0.0, -leftPaddingWidth, 0.0);
    }
}

一些笔记。它使用Grid中列的.ActualWidth。您当然可以将其更改为.Width,但是当您使用ColumnDefinition Width="30*"时可能会遇到问题,因为我非常确定您不会得到双倍的结果。其次,此函数不会在您传递的对象上设置填充,原因有两个:
   - 您可以将已退回的Thickness添加到已应用于.Padding的{​​{1}},以便您不会破坏其格式。
   - 您可以传递任何Control,而只有FrameworkElement有填充。也许您可以将返回的厚度添加到Controls属性中,或者甚至创建一个容器并在其中应用填充? 最后,您可以轻松地将两个.Margin合并到函数中,但是我将它们与清晰度分开 欢呼声。