WPF:在附加的属性中,如何等待直到视觉树正确加载?

Contango

我在WPF应用程序中有一个附加属性。

下面的代码在OnLoad事件内部,但是除非添加500毫秒的延迟,否则该代码将不起作用。

有什么方法可以避免这种延迟,并检测视觉树何时已加载?

private static void FrameworkElement_Loaded(object sender, RoutedEventArgs e)
{
    // ... snip...
    Window window = GetParentWindow(dependencyObject);

    // Without this delay, changing properties does nothing.
    Task task = Task.Run(
        async () =>
        {
            {
                // Without this delay, changing properties does nothing.
                await Task.Delay(TimeSpan.FromMilliseconds(500));

                Application.Current.Dispatcher.Invoke(
                    () =>
                    {
                        // Set False >> True to trigger the dependency property.
                        window.Topmost = false;
                        window.Topmost = true;                                              
                    });
            }
        });
 }

更新1

按照@Will的回答,“使用调度程序并选择适当的优先级”。这非常出色:

private static void FrameworkElement_Loaded(object sender, RoutedEventArgs e)
{
   // Wrap *everything* in a Dispatcher.Invoke with an appropriately
   // low priority, to defer until the visual tree has finished updating.
   Application.Current.Dispatcher.Invoke(
   async () =>
        {
            // This puts us to the back of the dispatcher queue.
            await Task.Yield();

            // ... snip...
            Window window = GetParentWindow(dependencyObject);

            window.Topmost = true;                                              
        }, 
        // Use an appropriately low priority to defer until 
        // visual tree updated.
        DispatcherPriority.ApplicationIdle);
 }

更新2

如果使用DevExpress,则LayoutTreeHelper类可用于在可视树的上下扫描。

有关处理上下可视树的示例代码,请参见:

更新3

如果您处于附加属性中,则可靠地加载视觉树的唯一方法是在Loaded事件处理程序中或之后执行代码如果我们不了解此限制,那么一切都会间歇性地失败。OnLoaded如上所述,等到事件触发后,它比尝试引入其他随机形式的延迟的方法要优越得多。

如果您使用的是DevExpress,这将变得更加关键:Loaded在某些情况下,尝试在事件发生前做任何事情都可能导致崩溃。

例如:

  • 在某些情况下window.Show(),在Loaded事件发生调用会导致崩溃。
  • 在某些情况下IsVisibleChangedLoaded事件发生之前将事件处理程序挂入钩子会导致崩溃。

免责声明:我与DevExpress无关,它是许多不错的WPF库之一,我还建议使用Infragistics。

用户名

如果您想等待在UI线程中做某事,请使用Dispatcher你如何抓住它?真是骗人

如何获取UI线程分派器?

您可以使用DispatcherPriority选择将来的时间。优先级基于UI活动,因此例如下周就不能说了。但是,例如,您可以说“让我等到绑定处理完毕之后”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WPF绑定到视觉树中某处的附加属性

来自分类Dev

如何等待直到Dart中加载了图像

来自分类Dev

如何等待直到容器视图中的视图被加载?

来自分类Dev

如何等待直到硒中不再存在元素

来自分类Dev

如何等待直到Swift中的动画完成?

来自分类Dev

如何等待直到jquery中的隐藏效果结束

来自分类Dev

如何等待直到事件在C#中处理

来自分类Dev

如何等待直到在jmeter中收到特定响应?

来自分类Dev

我如何等待直到在React中获得调度结果

来自分类Dev

如何等待直到水豚中的某个元素消失?

来自分类Dev

如何等待资源加载

来自分类Dev

如何等待,直到UploadStringAsync方法完成

来自分类Dev

如何等待直到matplotlib动画结束?

来自分类Dev

AngularJS如何等待直到返回承诺

来自分类Dev

如何等待返回直到某个事件?

来自分类Dev

如何等待数据加载到AngularJS中?

来自分类Dev

如何等待xml中的ImageView完成加载

来自分类Dev

QML:如何等待直到由于属性更改而重新绘制组件?

来自分类Dev

如何等待直到使用Selenium和Python定义了src属性

来自分类Dev

如何等待作业,直到父作业在python中完成多线程处理?

来自分类Dev

如何等待渲染组件,直到在Angular 2中收集了所有数据

来自分类Dev

如何等待Angular模块加载?

来自分类Dev

如何等待音频剪辑加载完毕?

来自分类Dev

如何等待Angular模块加载?

来自分类Dev

如何等待BingMaps在Aurelia中加载

来自分类Dev

如何等待服务加载数据完成?

来自分类Dev

JS-Canvas图像无法在chrome中正常工作(或如何等待图像正确加载)

来自分类Dev

如何等待CSS属性更改?

来自分类Dev

如何等待直到Task.ContinueWith内部任务完成

Related 相关文章

热门标签

归档