我确定这已经存在,但无法找到它。我正在寻找在我的应用程序上显示某种动画的 WPF 控件,以便我可以轻松判断 UI 线程何时锁定。我正在寻找控件来显示 UI 线程被锁定了多长时间。这将是一个开发工具,我只会在调试模式下运行时启用它,并且用于在 UI 长时间无响应时识别我的应用程序中的性能问题。所以我正在寻找类似于Visual Studio PerfWatson Monitor的东西。
我知道我可以自己写一个,但我敢肯定其他人已经这样做了(而且可能比我做得更好)。如果您知道一个,请与我分享。谢谢!
我确定这已经存在,但无法找到它。我正在寻找在我的应用程序上显示某种动画的 WPF 控件,以便我可以轻松判断 UI 线程何时锁定。我正在寻找控件来显示 UI 线程被锁定了多长时间。这将是一个开发工具,我只会在调试模式下运行时启用它,并且用于在 UI 长时间无响应时识别我的应用程序中的性能问题。所以我正在寻找类似于Visual Studio PerfWatson Monitor的东西。
我知道我可以自己写一个,但我敢肯定其他人已经这样做了(而且可能比我做得更好)。如果您知道一个,请与我分享。谢谢!
昨天本来打算回复这个的,但没有完整的解决方案,只是一个建议!
我做了这样的事情并创建了一个控件,它订阅 CompositionTarget.Rendering 作为“UI 线程繁忙度”的简单指标,然后在一个非常小的条形图上绘制帧速率(1.0/事件之间的时间),每秒更新一次。有问题的条形图非常轻量级,并且使用位图而不是 WPF 元素,因此它不会使用太多 CPU 时间。该控件可以覆盖在任何 WPF 表单上,作为调试性能问题的装饰器。

这是非常有启发性的,因为它实时显示 UI 线程退出。
抱歉,我不能共享任何代码作为我公司的专有代码,但我认为它可以让您了解如何解决这个问题。
为仅包含旋转矩形的任何控件创建控件模板。
然后,当您处于调试模式时,从后面的代码中添加控件,以确保它不会进入发布状态。
#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 锁定时,方块将停止旋转。