链接来自不同用户控件的网格列长度

时间:2010-11-17 00:00:50

标签: wpf wpf-controls binding

我有一个用户控件,称之为MyUserControl。 MyUserControl由一个包含一行和多列的网格组成。每列中都有一个textBox,每列的宽度设置为*。

现在我在另一个控件(_myUserControl1,2,3)的网格中添加了三个MyUserControl实例。我想要做的是将MyUserControls中某些列的列宽相互链接。

当我在其中一个MyUserControls中键入textBox时,如果输入的文本比当前textBox宽度长,则textBox宽度会自动增长。我希望其他MyUserControls中的相应列也可以扩展。

例如,我在_myUserControl1中输入一个textBox,并且_myUserControl2和_myUserControl3中的列也会扩展。

我尝试更新其他控件的ColumnDefinition宽度,并且工作正常。问题是,一旦我设置了ColumnDefinition的宽度,它就会失去其星大小的能力。因此,如果我稍后调整窗口大小,则列不再填充可用空间。

简而言之,我希望能够将网格列宽度设置为特定大小,并保持其星形大小调整功能,这样,如果我正在键入并且textBox变得更宽,则其他控制列会变宽以匹配。如果我然后调整窗口的宽度,列会扩展/收缩,就好像为这些列启用了星形大小,但保持正确的textBox宽度(我想我也不得不乱用列的MinWidths)。

这是可行的还是我在错误的树上吠叫?我希望单独的MyUserControls中的列始终具有相同的大小。

如果问题不明确,请告诉我,我会尽力使其更清楚。

感谢。

1 个答案:

答案 0 :(得分:0)

这是为每个MyUserControl实例保持列宽相等的一种方法。如果我想出一个更清洁的解决方案,我会更新。

alt text

首先,我们在MyUserControls代码后面的文件中创建一个静态的2d TextBoxes列表。第一个List是第0列中TextBox的所有实例的List。第二个List用于第1列,第三个List用于第2列。

private static List<List<TextBox>> s_textBoxesColumns;

在静态构造函数中我们初始化它

static MyUserControl()
{
    s_textBoxesColumns = new List<List<TextBox>>();
    s_textBoxesColumns.Add(new List<TextBox>());
    s_textBoxesColumns.Add(new List<TextBox>());
    s_textBoxesColumns.Add(new List<TextBox>());
}

在构造函数中,我们为此实例添加TextBoxes

public MyUserControl()
{
    InitializeComponent();
    s_textBoxesColumns[0].Add(textBox1);
    s_textBoxesColumns[1].Add(textBox2);
    s_textBoxesColumns[2].Add(textBox3);
}

为每个TextBox添加TextChanged事件

<TextBox Name="textBox1" Grid.Column="0" TextChanged="textBox_TextChanged"/>
<TextBox Name="textBox2" Grid.Column="1" TextChanged="textBox_TextChanged"/>
<TextBox Name="textBox3" Grid.Column="2" TextChanged="textBox_TextChanged"/>

在EventHandler中,我们检查这个事件是哪个TextBox

private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
    if (sender == textBox1)
    {
        SetWidthOfTextBoxes(0);
    }
    else if (sender == textBox2)
    {
        SetWidthOfTextBoxes(1);
    }
    else if (sender == textBox3)
    {
        SetWidthOfTextBoxes(2);
    }
}

最后我们测量此列的所有TextBox并将MinWidth设置为最宽TextBox的宽度

private void SetWidthOfTextBoxes(int column)
{
    double width = 0.0;
    foreach (TextBox textBox in s_textBoxesColumns[column])
    {
        textBox.MinWidth = 0.0;
        textBox.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        if (textBox.DesiredSize.Width > width)
        {
            width = textBox.DesiredSize.Width;
        }
    }
    foreach (TextBox textBox in s_textBoxesColumns[column])
    {
        textBox.MinWidth = width;
    }
}