Какое событие происходит после загрузки для WPF UserControl? - PullRequest
4 голосов
/ 10 августа 2011

У меня есть DataGrid, который я связываю в функции конструктора моего UserControl (после InitializeComponent). Мне нужно получить доступ к некоторым строкам в нем, поэтому в загруженном событии для UserControl я запускаю:

DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx);

Однако всякий раз, когда я это делаю, ItemContainerGenerator.ContainerFromIndex возвращает ноль. Похоже, DataGrid еще не был полностью сгенерирован, поэтому, чтобы проверить / подтвердить эту теорию, я нажал кнопку на экране, и по событию нажатия кнопки я снова запустил этот код, а затем, конечно же, строка ценность. Итак, это подтверждается, когда запускается загруженное событие UserControl, это происходит слишком рано, и я пока не могу вызвать ItemContainerGenerator.ContainerFromIndex для моей DataGrid.

Какое событие запускается после загрузки, чтобы я мог использовать вместо него?

Примечание : Я также попробовал этот код, который нашел, но получил те же результаты:

DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx);
if (row == null)
{
    myDataGrid.UpdateLayout();
    myDataGrid.ScrollIntoView(myDataGrid.Items[rowIdx]);
    row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx);
}

И я также попытался сделать это в загруженном событии DataGrid, но результаты те же.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 11 августа 2011

Вы можете запустить этот код с более низким DispatcherPriority , чем Loaded, например Input

Например, событие DataGrid Loaded будет содержать что-то похожее на это:

MyDataGrid.Dispatcher.BeginInvoke(DispatcherPriority.Input,
    new Action(delegate() { RunSomeFunction(); } ));
4 голосов
/ 11 августа 2011

Спасибо всем!Это в конечном итоге делает трюк:

myDataGrid.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);
:
:
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    if (myDataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
    {
        DataGridRow row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx);
        if (row == null)
        {
            myDataGrid.UpdateLayout();
            myDataGrid.ScrollIntoView(myDataGrid.Items[rowIdx]);
            row = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromIndex(rowIdx);
        }
    }
}
0 голосов
/ 11 августа 2011

Согласно этой статье выглядит, что последним событием в новой форме будет событие ContentRendered.
Но, похоже, из этой статьи , для usercontrol последним событием будет событие Loaded.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...