【问题标题】:TextBlock doesn't want to adjust grid columnsTextBlock 不想调整网格列
【发布时间】:2020-08-01 19:08:02
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf grid width textblock


    【解决方案1】:

    您必须在 StackPanel 中将依赖属性 Grid.IsSharedSizeScope 设置为 true,然后将每个 ColumnDefinition 的属性 SharedSizeGroup 设置为定义具有相同大小的组的字符串。

    【讨论】:

    • 感谢您的回答。此属性修复了网格中列宽的问题,但是如何使文本块在第三列的末尾换行,而不是无限制地向右拉伸?
    • 将 'Row.Height' 设置为 auto 并将 TextBlock.TextWrapping 设置为 'Wrap'
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 1970-01-01
      • 2020-04-13
      • 2012-12-22
      • 2012-03-24
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多