You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2022与.NET 6.0环境下Microsoft.Expression.Drawing兼容版本及替代方案咨询

解决.NET 6.0 + VS2022下WPF圆形进度条的替代方案

我之前也碰到过一模一样的问题——那个Microsoft.Expression.Drawing包本来就是为旧版.NET Framework设计的,官方根本没推出适配.NET 6+的版本,所以安装时出现兼容报错是必然的。不过不用慌,咱们有几个非常靠谱的替代方案,完全能搞定圆形进度条的需求:

方案一:用WPF原生Path控件手动绘制圆弧

不需要任何额外NuGet包,完全靠WPF自带的控件就能实现。核心思路是用Path的Data属性结合ArcSegment来创建圆弧,再通过绑定进度值动态调整圆弧的角度。

举个简单的例子,你可以在XAML里这么写:

<Path Stroke="Blue" StrokeThickness="8" StrokeLineCap="Round">
    <Path.Data>
        <PathGeometry>
            <PathFigure StartPoint="100,20">
                <ArcSegment x:Name="ProgressArc" Size="80,80" SweepDirection="Clockwise" IsLargeArc="False" Point="100,180"/>
            </PathFigure>
        </PathGeometry>
    </Path.Data>
</Path>

然后后台可以写一个值转换器,把0-100的进度值转换成ArcSegment的Point坐标,或者直接通过绑定更新这个点的位置,就能实现进度条的动态变化。这种方式完全自主可控,适合需要高度自定义样式的场景。

方案二:使用微软官方维护的CommunityToolkit控件包

如果你不想自己写太多代码,直接用CommunityToolkit.Wpf.UI.Controls这个NuGet包就好——这是微软官方维护的,完美兼容.NET 6+和VS2022,里面自带现成的CircularProgressBar控件。

步骤很简单:

  1. 在NuGet包管理器里搜索安装CommunityToolkit.Wpf.UI.Controls
  2. 在XAML里引入命名空间:xmlns:controls="clr-namespace:Microsoft.Toolkit.Wpf.UI.Controls;assembly=Microsoft.Toolkit.Wpf.UI.Controls"
  3. 直接使用控件:
<controls:CircularProgressBar Value="75" Maximum="100" Stroke="Green" StrokeThickness="6"/>

这个方案省心省力,控件本身还支持很多自定义属性,比如颜色、厚度、动画效果等等,大部分场景下够用。

方案三:自定义控件重写OnRender方法

如果上面两种都满足不了你的需求,比如需要更复杂的交互或者特效,那可以自己封装一个自定义控件,重写OnRender方法来绘制圆弧。

比如创建一个继承自FrameworkElement的控件,在OnRender里用DrawingContext.DrawArc方法来画:

protected override void OnRender(DrawingContext drawingContext)
{
    base.OnRender(drawingContext);
    
    double progress = 0.75; // 这里可以绑定进度值
    Point center = new Point(ActualWidth / 2, ActualHeight / 2);
    double radius = Math.Min(ActualWidth, ActualHeight) / 2 - 4;
    Pen pen = new Pen(Brushes.Orange, 8);
    
    // 计算起始和结束角度
    double startAngle = -90; // 从顶部开始
    double endAngle = startAngle + progress * 360;
    
    drawingContext.DrawArc(pen, center, radius, startAngle * Math.PI / 180, endAngle * Math.PI / 180, true);
}

这种方式灵活性最高,想怎么定制就怎么定制,适合有特殊需求的场景。

总的来说,根据你的需求选对应的方案就行:想快速实现用CommunityToolkit,想自己把控细节用原生Path,要高度定制就自己写自定义控件。

内容的提问来源于stack exchange,提问作者chuckp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:12:51