我有一个用户控件,称之为MyUserControl。 MyUserControl由一个包含一行和多列的网格组成。每列中都有一个textBox,每列的宽度设置为*。
现在我在另一个控件(_myUserControl1,2,3)的网格中添加了三个MyUserControl实例。我想要做的是将MyUserControls中某些列的列宽相互链接。
当我在其中一个MyUserControls中键入textBox时,如果输入的文本比当前textBox宽度长,则textBox宽度会自动增长。我希望其他MyUserControls中的相应列也可以扩展。
例如,我在_myUserControl1中输入一个textBox,并且_myUserControl2和_myUserControl3中的列也会扩展。
我尝试更新其他控件的ColumnDefinition宽度,并且工作正常。问题是,一旦我设置了ColumnDefinition的宽度,它就会失去其星大小的能力。因此,如果我稍后调整窗口大小,则列不再填充可用空间。
简而言之,我希望能够将网格列宽度设置为特定大小,并保持其星形大小调整功能,这样,如果我正在键入并且textBox变得更宽,则其他控制列会变宽以匹配。如果我然后调整窗口的宽度,列会扩展/收缩,就好像为这些列启用了星形大小,但保持正确的textBox宽度(我想我也不得不乱用列的MinWidths)。
这是可行的还是我在错误的树上吠叫?我希望单独的MyUserControls中的列始终具有相同的大小。
如果问题不明确,请告诉我,我会尽力使其更清楚。
感谢。
答案 0 :(得分:0)
这是为每个MyUserControl实例保持列宽相等的一种方法。如果我想出一个更清洁的解决方案,我会更新。
首先,我们在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;
}
}