加载WPF UserControl后会发生什么事件?

时间:2011-08-10 19:28:47

标签: c# wpf events datagrid

我有一个DataGrid,我在UserControl的构造函数中绑定(在InitializeComponent之后)。我需要访问其中的一些行,因此在UserControl的加载事件中,我运行:

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

但是每当我这样做时,ItemContainerGenerator.ContainerFromIndex都会返回null。看起来像DataGrid还没有完全生成,所以为了测试/确认理论,我在屏幕上抛出一个按钮,然后在按钮的click事件上,我再次运行该代码,然后果然,行已经一个值。因此,已经确认,当UserControl的加载事件触发时,它发生得太早,我还无法为我的DataGrid调用ItemContainerGenerator.ContainerFromIndex。

我可以使用加载后触发什么事件?

注意:我也尝试过这个代码,但结果相同:

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 个答案:

答案 0 :(得分:5)

您可以在低于DispatcherPriority的情况下运行该代码,例如Input

例如,DataGrid的Loaded事件将包含如下内容:

MyDataGrid.Dispatcher.BeginInvoke(DispatcherPriority.Input,
    new Action(delegate() { RunSomeFunction(); } ));

答案 1 :(得分:4)

谢谢大家!这最终成功了:

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

答案 2 :(得分:0)

根据此article,新表单上的最后一个事件将是ContentRendered事件。
但是从这个article看起来,对于usercontrol,最后一个事件将是Loaded事件。

您可以尝试在加载事件结束时设置一个延迟较小的计时器来运行您的代码,以便进行一些分离。