TextBlock 不想调整网格列

TextBlock doesn't want to adjust grid columns

我正在准备控件以显示一些数据。它是按以下方式构建的:

-> 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;
    }

How it looks like

它工作得很好,但是当我添加最后一个 TextBlock 时,整个控件向右拉伸。在设计器中,创建元素的方式相同,但在代码中没有。我做错了什么?

我想用第 1 列和第 2 列各处的宽度相同来实现这种效果。 What I want

您必须将每个 ColumnDefinition 的依赖项 属性 Grid.IsSharedSizeScope to true in the StackPanel and then set the Property SharedSizeGroup 设置为定义具有相同大小的组的字符串。

我自己解决了这个问题。如果有人遇到和我一样的问题,我会写下如何修复它。

在我的应用程序初始化的地方 ScrollViewer 我将 属性 HorizontalScrollBarVisibility 设置为 Hidden。将此 属性 设置为 Disabled 后,一切开始正常工作。

这里有一些东西: https://crmdev.wordpress.com/2010/01/16/how-to-deal-with-stubborn-silverlight-a-k-a-stubborn-me/