【问题标题】:How to set wpf grid rowspan programmatically?如何以编程方式设置 wpf 网格行跨度?
【发布时间】:2014-01-12 02:55:06
【问题描述】:

如何以编程方式设置 wpf 网格行跨度?我正在使用 mvvm 模式。 我启用了网格线,但以下不起作用:

RowDefinition row0 = new RowDefinition();
myGrid.RowDefinitions.Add(row0)

for (int i = 1; i <= RowsCount; i++)
{
    RowDefinition row = new RowDefinition();
    myGrid.RowDefinitions.Add(row);
    TextBlock txt3 = new TextBlock();
    txt3.Text = i.ToString();
    txt3.FontSize = 12;
    txt3.FontWeight = FontWeights.Bold;
    Grid.SetRow(txt3, i);

    myGrid.Children.Add(txt3);
}

ColumnDefinition column0 = new ColumnDefinition();
myGrid.ColumnDefinitions.Add(column0);


char c = 'A';
for (int i = 1; i <= ColumnsCount; i++)
{
    ColumnDefinition column = new ColumnDefinition();
    myGrid.ColumnDefinitions.Add(column);                
    TextBlock txt3 = new TextBlock();
    txt3.Text = c.ToString();
    txt3.FontSize = 12;
    txt3.FontWeight = FontWeights.Bold;
    Grid.SetColumn(txt3, i);
    myGrid.Children.Add(txt3);

    switch (i)
    {
        case 1:
            for (int j = 1; j <= RowsCount; j++)
            {
                TextBlock txt = new TextBlock();
                txt.Text = ColumnAROI[j-1].ToString();
                Grid.SetRow(txt, j);
                Grid.SetColumn(txt, i);
                Grid.SetRowSpan(txt, 2);
               // Grid.SetRowSpan(txt, TubeRowSpan[j]);
                myGrid.Children.Add(txt);
            }

            break;
    }

    c++;
}

    for (int j = 1; j <= RowsCount; j++)
        {
            TextBlock txt = new TextBlock();
            txt.Text = ColumnAROI[j-1].ToString();
            Grid.SetRow(txt, j);
            Grid.SetColumn(txt, i);
            Grid.SetRowSpan(txt, TubeRowSpan[j]);
            myGrid.Children.Add(txt);
        }

TubeRowSpan 是一个 int 类型的 ObservableCollection,定义如下。它包含除位置 2(第 3 个元素)之外的所有 1。

private ObservableCollection<int> _TubeRowSpan = new ObservableCollection<int>();
    public ObservableCollection<int> TubeRowSpan
    {
        get { return _TubeRowSpan; }
        set
        {
            if (_TubeRowSpan != value)
            {
                _TubeRowSpan = value;
                RaisePropertyChanged(() => TubeRowSpan);
            }
        }
    }

【问题讨论】:

  • 我已经试过你的代码,它工作正常
  • @ethicallogics 我已经编辑了我的问题
  • 第 4 个元素可能会覆盖第 3 个元素并且不会在第 4 行显示第 3 个元素
  • 抱歉,这看起来不像 MVVM。
  • @MarkFeldman 我正在使用 MVVM 模式。我在 ViewModel 构造函数中创建网格并设置属性。上面的代码在我的 ViewModel 中。

标签: c# .net wpf silverlight mvvm


【解决方案1】:

您必须发布其余代码,特别是您如何创建行定义。以下代码为每个元素创建 3 行并将行跨度设置为 2,从结果中很容易看出它按预期工作:

int numChildren = 10;
        int numRows = numChildren * 3;
        for (int j = 0; j < numRows; j++)
            this.myGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(30) });
        for (int j = 0; j < numChildren; j++)
        {
            TextBlock txt = new TextBlock();
            txt.Background = Brushes.AliceBlue;
            txt.Text = "Row " + Convert.ToString(j);
            Grid.SetRow(txt, j*3);
            Grid.SetRowSpan(txt, 2);
            myGrid.Children.Add(txt);
        }

我怀疑您的 RowDefinitions 存在问题,导致它们崩溃到 0 的高度,使其 看起来 好像它不起作用,而实际上它是。尝试用我的代码替换你的整个代码,然后一点一点地替换你自己的部分。

【讨论】:

  • 为什么要将 numChildren 乘以 3?可以通过定义高度来解决吗?无论如何,现在我已经包含了我的行定义。
  • 我将 numChildren 乘以 3,这样我给每个孩子两行(注意我还给了他们一个彩色背景),然后我将它们分开第三行。抱歉,如果这令人困惑,这只是为了让您在视觉上更容易确认 RowSpan 是否正常工作。
  • 哦,我明白了,但我可以在我的实际代码中做到这一点,rowspan 可以跨越 1 到 6 之间的任何内容。顺便说一句,现在我已经完成了我的问题的编辑。
  • 首先想到的是您正在从 1. Grid RowDefinitions 和 ColumnDefinitions 以及零索引开始索引您的行。
  • 不,我没有在问题中包含第 0 行。现在编辑问题以包含第 0 行。
猜你喜欢
  • 2015-05-06
  • 2014-10-08
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多