Silverlight Grid - отображаемое значение, которое не соответствует его ячейке - PullRequest
1 голос
/ 30 мая 2011

Я знаю, что мы можем растянуть элемент вправо или вниз, используя ColumnSpan и RowSpan

Однако я получил элемент, который хочу отобразить в ячейке сетки, и отцентрировать его по центру этой ячейки, чтобы он охватывал и вправо и влево в случае текста, здесь я предоставляю изображение того, как он выглядит в настоящее время, текст «12345» не может поместиться в столбце и отображается как «234», есть ли способ сделать1 и 5 видны, оставляя все столбцы нетронутыми? enter image description here

Текст может быть изменен на что угодно и должен быть центрирован правильно, я могу взломать способ отображения 12345 таким образом, но нужно решение, которое будет работать слюбой текст, на всякий случай, и сетка textBlock. Столбец нужно оставить нетронутым 1 (или 2, если быть точным для моего случая), а не 0 для этого случая изображения.

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Раствор 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);
    }
}

Пара заметок.Он использует .ActualWidth столбцов в сетке.Конечно, вы можете изменить это значение на .Width, однако вы можете столкнуться с проблемами при использовании ColumnDefinition Width="30*", потому что я совершенно уверен, что в результате вы не получите удвоение.Во-вторых, эта функция не устанавливает отступ для объекта, который вы передаете, по двум причинам:- Вы можете взять возвращенный Thickness и добавить его к .Padding, уже примененному к Control, чтобы вы не уничтожили его форматирование.- Вы можете передать любой FrameworkElement, тогда как только Controls имеют отступы.Возможно, вы могли бы вместо этого добавить возвращаемую толщину к свойству .Margin или даже создать контейнер и применить к нему отступы?Наконец, вы можете легко объединить два for loops внутри функции, но я оставил их отдельно от ясности.Приветствия.

1 голос
/ 30 мая 2011

Я не уверен, что полностью понимаю ограничения вашей проблемы, поэтому возможно, что ни одно из этих решений не будет работать, но вот два быстрых предложения.(Лично мне больше нравится Решение 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>

Я надеюсь, что это работает в рамках ваших ограничений, а если нет, то поможет вам найти решение самостоятельно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...