TextBlock не хочет корректировать столбцы сетки - PullRequest
0 голосов
/ 19 апреля 2020

Я готовлю контроль, чтобы представить некоторые данные. Он построен следующим образом:

-> ScrollViewer
--> StackPanel
---> Border
----> Grid
---> Border
----> Grid
...
---> Border
----> Grid

И есть мой код для каждого элемента

    public class PresenterItem : Border
{
    // Variables
    private Submission submission;
    private int index;

    private Grid grid = new Grid();

    // Constructor
    public PresenterItem(int i, Submission subm)
    {
        index = i;
        submission = subm;
        Child = grid;

        Background = Global.GET_BRUSH("ItemBackground");
        CornerRadius = new CornerRadius(5);
        Margin = new Thickness(0, 0, 0, 10);
        Padding = new Thickness(5);

        grid.ShowGridLines = true;


        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(40, GridUnitType.Pixel) });
        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(2, GridUnitType.Star) });
        grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(2, GridUnitType.Star) });

        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(40, GridUnitType.Pixel) });
        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(30, GridUnitType.Pixel) });
        grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });

        InsertContent();
    }

    private Label CreateLabel(int row, int column, string content, int columnSpan = 1)
    {
        Label newLabel = new Label();
        newLabel.Content = content;

        Grid.SetRow(newLabel, row);
        Grid.SetColumn(newLabel, column);
        Grid.SetColumnSpan(newLabel, columnSpan);

        grid.Children.Add(newLabel);

        return newLabel;
    }
    private TextBlock CreateTextBlock(int row, int column, int columnSpan = 1)
    {
        TextBlock newTextBlock = new TextBlock();
        newTextBlock.Foreground = Brushes.Silver;

        Grid.SetRow(newTextBlock, row);
        Grid.SetColumn(newTextBlock, column);
        Grid.SetColumnSpan(newTextBlock, columnSpan);

        grid.Children.Add(newTextBlock);

        return newTextBlock;
    }

    private void InsertContent()
    {
        // Number
        Label number = CreateLabel(0, 0, $"#{index + 1}");
        number.HorizontalAlignment = HorizontalAlignment.Center;
        number.VerticalAlignment = VerticalAlignment.Center;
        number.FontSize = 17;

        // Header
        Label header = CreateLabel(0, 1, $"{submission.Name} ({submission.Rank})");
        header.Foreground = Global.GET_BRUSH("HeaderForeground");
        header.HorizontalAlignment = HorizontalAlignment.Left;
        header.VerticalAlignment = VerticalAlignment.Center;
        header.FontSize = 17;

        // Timestamp
        TextBlock timestamp = CreateTextBlock(0, 2);
        timestamp.Inlines.Add(new Run("Timestamp"));
        timestamp.Inlines.Add(new Run($"{submission.Timestamp}") { Foreground = Global.GET_BRUSH("HeaderForeground") });

        timestamp.HorizontalAlignment = HorizontalAlignment.Right;
        timestamp.VerticalAlignment = VerticalAlignment.Center;
        timestamp.FontSize = 13.5;

        // Range
        TextBlock range = CreateTextBlock(1, 1);
        range.Inlines.Add(new Run("Some text "));
        range.Inlines.Add(new Run($"{submission.Range.ToStringWithDayNames()}") { Foreground = Global.GET_BRUSH("HeaderForeground") });

        range.HorizontalAlignment = HorizontalAlignment.Left;
        range.VerticalAlignment = VerticalAlignment.Center;
        range.Margin = new Thickness(5, 0, 0, 0);
        range.FontSize = 13.5;

        // Conflict
        Label conflict = CreateLabel(1, 2, "Nie wykryto konfliktu");
        conflict.Foreground = Global.GET_BRUSH("GreenForeground");
        conflict.HorizontalAlignment = HorizontalAlignment.Right;
        conflict.VerticalAlignment = VerticalAlignment.Center;
        conflict.FontSize = 13.5;

        // Content
        TextBlock content = CreateTextBlock(2, 1, 2);
        content.Inlines.Add(new Run($"{submission.Content}"));

        cotent.HorizontalAlignment = HorizontalAlignment.Left;
        content.VerticalAlignment = VerticalAlignment.Top;
        content.Margin = new Thickness(5, 0, 0, 0);
        content.TextWrapping = TextWrapping.WrapWithOverflow;
        content.FontSize = 13.5;
    }

Как это выглядит

Это прекрасно работает, но когда я добавил последний TextBlock, весь элемент управления растягивается вправо. В конструкторе работает тот же способ создания элементов, но в коде нет. Что я делаю не так?

Я бы хотел добиться этого эффекта с колонками 1 и 2 с одинаковой шириной везде. Что я хочу

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Необходимо установить для свойства зависимости Grid.IsSharedSizeScope значение true в StackPanel, а затем установить для свойства SharedSizeGroup для каждого ColumnDefinition строку, определяющую группу с таким же размером.

0 голосов
/ 19 апреля 2020

Я справился с этой проблемой самостоятельно. Если у кого-то возникнет такая же проблема, как у меня, я напишу, как ее исправить.

В том месте, где мое приложение инициализируется ScrollViewer Я установил для свойства HorizontalScrollBarVisibility значение Hidden. После установки этого свойства в Disabled все начинает работать правильно.

Что-то в этом есть: https://crmdev.wordpress.com/2010/01/16/how-to-deal-with-stubborn-silverlight-a-k-a-stubborn-me/

...