1

我确定这已经存在,但无法找到它。我正在寻找在我的应用程序上显示某种动画的 WPF 控件,以便我可以轻松判断 UI 线程何时锁定。我正在寻找控件来显示 UI 线程被锁定了多长时间。这将是一个开发工具,我只会在调试模式下运行时启用它,并且用于在 UI 长时间无响应时识别我的应用程序中的性能问题。所以我正在寻找类似于Visual Studio PerfWatson Monitor的东西。

我知道我可以自己写一个,但我敢肯定其他人已经这样做了(而且可能比我做得更好)。如果您知道一个,请与我分享。谢谢!

4

2 回答 2

2

昨天本来打算回复这个的,但没有完整的解决方案,只是一个建议!

我做了这样的事情并创建了一个控件,它订阅 CompositionTarget.Rendering 作为“UI 线程繁忙度”的简单指标,然后在一个非常小的条形图上绘制帧速率(1.0/事件之间的时间),每秒更新一次。有问题的条形图非常轻量级,并且使用位图而不是 WPF 元素,因此它不会使用太多 CPU 时间。该控件可以覆盖在任何 WPF 表单上,作为调试性能问题的装饰器。

在此处输入图像描述

这是非常有启发性的,因为它实时显示 UI 线程退出。

抱歉,我不能共享任何代码作为我公司的专有代码,但我认为它可以让您了解如何解决这个问题。

于 2013-11-14T09:33:53.423 回答
0

为仅包含旋转矩形的任何控件创建控件模板。

然后,当您处于调试模式时,从后面的代码中添加控件,以确保它不会进入发布状态。

#if DEBUG
if(runtimeCondition)
{
    //add or unhide control
}
#end if

真的很容易实现,这里有一个模板。

<ControlTemplate x:Key="spinningSquareTemplate">
            <ControlTemplate.Resources>
                <Storyboard x:Key="OnLoaded1" RepeatBehavior="Forever">
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="rectangle">
                        <EasingDoubleKeyFrame KeyTime="0:0:1" Value="360"/>
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </ControlTemplate.Resources>
            <Rectangle x:Name="rectangle" Fill="#FFFFB900" Stroke="Black" RenderTransformOrigin="0.5,0.5">
                <Rectangle.RenderTransform>
                    <TransformGroup>
                        <ScaleTransform/>
                        <SkewTransform/>
                        <RotateTransform/>
                        <TranslateTransform/>
                    </TransformGroup>
                </Rectangle.RenderTransform>
            </Rectangle>
            <ControlTemplate.Triggers>
                <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                    <BeginStoryboard Storyboard="{StaticResource OnLoaded1}"/>
                </EventTrigger>
            </ControlTemplate.Triggers>

        </ControlTemplate>

当您的 UI 锁定时,方块将停止旋转。

于 2013-11-14T09:37:38.827 回答