Спустя годы, но так как я искал рабочее решение, так как теперь напрасно, я хочу поделиться своим открытием.
Если вы хотите событие ContentRendered
для любого элемента управления (или любого визуального или даже DependencyObject)), вы должны копать до Visual
.
Я использую этот код:
// Wait for Control to Load
void TestUserControl_Loaded(object sender, RoutedEventArgs e)
{
// Get PresentationSource
PresentationSource presentationSource = PresentationSource.FromVisual((Visual)sender);
// Subscribe to PresentationSource's ContentRendered event
presentationSource.ContentRendered += TestUserControl_ContentRendered;
}
void TestUserControl_ContentRendered(object sender, EventArgs e)
{
// Don't forget to unsubscribe from the event
((PresentationSource)sender).ContentRendered -= TestUserControl_ContentRendered;
// ..
}
Вы должны ждать Control Loaded
, иначе PresentationSource.FromVisual () возвращает ноль.
Различные методы Dispatcher.BeginInvoke не работали для меня согласованно.Иногда запускаю мое визуализированное событие задолго до того, как элемент управления фактически отобразился.
Это работает для меня каждый раз.
Мне известно, что я играю здесь с HwndSource, который является довольно низким уровнем, и я не уверен в возможных последствиях.(Может быть, кто-то более опытный может уточнить.)