Связывание длин столбцов сетки от разных пользовательских элементов управления - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть пользовательский элемент управления, назовите его MyUserControl. MyUserControl состоит из одной сетки с одной строкой и несколькими столбцами. В каждом столбце есть один текстовый блок, а ширина каждого столбца установлена ​​на *.

Теперь я добавил три экземпляра MyUserControl в сетку в другом элементе управления (_myUserControl1,2,3). Я хочу связать ширину столбцов некоторых столбцов в MyUserControls друг с другом.

Когда я набираю textBox в одном из MyUserControls, ширина textBox увеличивается автоматически, если введенный текст длиннее текущей ширины textBox. Я хочу, чтобы соответствующие столбцы в других MyUserControls также расширялись.

Например, я набираю textBox в _myUserControl1, а столбцы в _myUserControl2 и _myUserControl3 также расширяются.

Я попытался обновить ширину ColumnDefinition других элементов управления, и это прекрасно работает. Проблема заключается в том, что после того, как я установил ширину ColumnDefinition, он теряет возможность определения размера звезды. В результате, если я позже изменю размер окна, столбцы больше не будут заполнять доступное пространство.

Короче говоря, я хочу иметь возможность установить ширину столбца сетки для определенного размера и сохранить его возможность масштабирования по звездам, чтобы при наборе текста и увеличении размера текстового поля другие столбцы управления становились шире, чтобы соответствовать , Если я затем изменю размер ширины окна, столбцы будут расширяться / сжиматься, как если бы для этих столбцов был включен размер звезды, но при этом сохранялась правильная ширина textBox (я думаю, мне также пришлось бы возиться с MinWidths столбцов).

Это выполнимо или я лаю не на том дереве? Я хочу, чтобы столбцы в отдельных элементах MyUserControls всегда были одинакового размера.

Пожалуйста, дайте мне знать, если вопрос не ясен, и я сделаю все возможное, чтобы прояснить его.

Спасибо.

1 Ответ

0 голосов
/ 17 ноября 2010

Это один из способов сохранения ширины столбца равной для каждого экземпляра MyUserControl.Я обновлюсь, если найду более чистое решение.

alt text

Сначала мы создадим статический 2d список TextBoxes в коде MyUserControls за файлом.Первый список представляет собой список всех экземпляров TextBox в столбце 0. Второй список предназначен для столбца 1 и третьего списка, если для столбца 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>());
}

В конструкторе мы затем добавляем TextBox для этого экземпляра

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

Добавить событие TextChanged для каждого TextBox

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