C# 圆边形状的容许透明度替代方案

C# 圆边形状的容许透明度替代方案,c#,.net,wpf,user-interface,C#,.net,Wpf,User Interface,我有一个WPF项目,主窗口需要有圆角。我现在可以通过设置AllowTransparency=True来实现这一点。这样,圆角附近的白色背景变得透明 然而,AllowTransparency是缓慢且有缺陷的。特别是有一个问题,AllowTransparency被严重破坏,MS拒绝修复它——这影响了我的客户。此外,微软建议的修补程序充其量也不一致,因此这也不是一个选项 我似乎有两个选择:1)简单地关闭AllowTransparency,然后创建一个非常难看的形状;2)找到一个解决方案,在没有Allo

我有一个WPF项目,主窗口需要有圆角。我现在可以通过设置AllowTransparency=True来实现这一点。这样,圆角附近的白色背景变得透明

然而,AllowTransparency是缓慢且有缺陷的。特别是有一个问题,AllowTransparency被严重破坏,MS拒绝修复它——这影响了我的客户。此外,微软建议的修补程序充其量也不一致,因此这也不是一个选项

我似乎有两个选择:1)简单地关闭AllowTransparency,然后创建一个非常难看的形状;2)找到一个解决方案,在没有AllowTransparency的情况下创建圆角

StackO在WPF项目中是否可能有AllowTransparency=False的圆角?谢谢。

也许这有帮助?(仍具有允许透明度) 或者这个:

也许这有帮助?(仍具有允许透明度)
或者这个:

我不久前写了一个库,它可以做到这一点:

它为窗口显示一个WindowChrome附加属性,该属性摆脱了标准的WindowChrome,然后,如果指定不需要玻璃框架,则可以指定一个CornerRadius属性,以使任意一个角圆化。下载中包含了一个示例项目,展示了不同属性的工作原理

该库是通过处理WM_NCCALCSIZE(类似于Office定制chrome所做的),而不是使用分层窗口来实现的,这就是Window.allowsttransparency的实现方式


该链接指向该库的一个稍旧的版本,但我自那以后修复的大多数错误我认为不会影响您,因为听起来您没有使用glass。

我不久前写了一个库,它可以做到这一点:

它为窗口显示一个WindowChrome附加属性,该属性摆脱了标准的WindowChrome,然后,如果指定不需要玻璃框架,则可以指定一个CornerRadius属性,以使任意一个角圆化。下载中包含了一个示例项目,展示了不同属性的工作原理

该库是通过处理WM_NCCALCSIZE(类似于Office定制chrome所做的),而不是使用分层窗口来实现的,这就是Window.allowsttransparency的实现方式


该链接指向该库的一个稍旧的版本,但我自那以后修复的大多数错误我认为不会影响您,因为听起来您好像没有使用玻璃。

如果您只想剪裁圆角,可以覆盖表单中的OnPaint并创建路径(System.Drawing.Drawing2D.GraphicsPath)并将该路径指定给窗体的区域属性。这有点笨重,但它可以做你想要的。例如,对于均匀弯曲的拐角,您可以执行以下操作(vb,而不是C#,抱歉):


如果只想剪裁圆角,可以在窗体中重写OnPaint,并使用所需的窗口形状创建路径(System.Drawing.Drawing2D.GraphicsPath),并将该路径指定给窗体的Region属性。这有点笨重,但它可以做你想要的。例如,对于均匀弯曲的拐角,您可以执行以下操作(vb,而不是C#,抱歉):


你有没有尝试过微软建议的修补程序?3)让你的客户感觉到一些道理?或者他们有带圆角的显示区域吗?@Dowhilef是的,我试过热修复程序,但不一致。这也不是我们希望客户端必须做的事情。为windows提供形状的本机方法是通过SetWindowsRgn()。WPF根本不支持它,这有点奇怪,可能是为了避免自动缩放的麻烦。您可以在System.Drawing.Region.GetHrgn()的帮助下进行pinvoke。您是否尝试过microsoft建议的修补程序?3)对您的客户有一定的帮助?或者他们有带圆角的显示区域吗?@Dowhilef是的,我试过热修复程序,但不一致。这也不是我们希望客户端必须做的事情。为windows提供形状的本机方法是通过SetWindowsRgn()。WPF根本不支持它,这有点奇怪,可能是为了避免自动缩放的麻烦。您可以在System.Drawing.Region.GetHrgn()的帮助下pinvoke它。Microsoft Ribbon for WPF中有一个更新版本的Microsoft.Windows.Shell.dll。查看此线程:Microsoft Ribbon for WPF中有一个更新版本的Microsoft.Windows.Shell.dll。请参阅此线程:
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        Dim r As Rectangle = Me.ClientRectangle
        Dim w As Integer = 50 'width of curvature
        Dim h As Integer = 50 'heigth of curvature

        Dim gp As New System.Drawing.Drawing2D.GraphicsPath
        gp.StartFigure()
        gp.AddArc(r.Right - w, r.Top, w, h, 270, 90)
        gp.AddArc(r.Right - w, r.Bottom - h, w, h, 0, 90)
        gp.AddArc(r.Left, r.Bottom - h, w, h, 90, 90)
        gp.AddArc(r.Left, r.Top, w, h, 180, 90)
        gp.CloseFigure()

        e.Graphics.DrawPath(Pens.Black, gp)

        Me.Region = New System.Drawing.Region(gp)

    End Sub