我知道我们可以使用ColumnSpan和RowSpan
向右或向下拉伸项目然而,我得到了一个我希望在网格单元格中显示的项目,并根据此单元格中心对其进行居中,因此在文本的情况下,它将向右和向左两个,这里我提供了一个图像当前它看起来如何,“12345”文本不能适合列并显示为“234”,有没有办法使1& 5可见,所有列都保持不变?
文本可以更改为任何内容并且必须正确居中,我可以通过这种方式破解显示12345的方法,但需要一个可以处理任何文本的解决方案,以防万一,textBlock grid.Column必须是保持不变1(或者2对于我的情况来说是精确的),对于这个图片情况不是0。
答案 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
合并到函数中,但是我将它们与清晰度分开
欢呼声。