【问题标题】:AllowTransparency alternative for rounded edge formsAllowTransparency 圆边形式的替代方案
【发布时间】:2012-01-09 15:14:15
【问题描述】:

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

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

看来我有两个选择:1) 简单地关闭 AllowTransparency 并有一个非常丑陋的形式,或者 2) 找到一种解决方法,在没有 AllowTransparency 的情况下使边缘变圆。

StackO 是否可以在 WPF 项目中使用 AllowTransparency=False 进行圆角处理?谢谢。

【问题讨论】:

  • 你试过微软推荐的hotfix吗?
  • 3) 给您的客户一些理智?还是有带圆角的展示区?
  • @dowhilefor 是的,我已经尝试过修补程序,但它不一致。这也不是我们希望客户必须做的事情。
  • 给窗口一个形状的本地方法是通过 SetWindowsRgn()。 WPF 根本不支持它,这有点奇怪,可能是为了避免自动缩放的麻烦。您可以在 System.Drawing.Region.GetHrgn() 的帮助下调用它。

标签: c# .net wpf user-interface


【解决方案1】:

也许这有帮助? http://www.kirupa.com/blend_wpf/custom_wpf_windows.htm(仍然使用 AllowTransparency ) 或者这个:http://www.codeproject.com/KB/WPF/CustomWPFWindow.aspx

【讨论】:

    【解决方案2】:

    我不久前写了一个库来做这个:http://archive.msdn.microsoft.com/WPFShell

    它为 Window 公开了一个 WindowChrome 附加属性,该属性摆脱了标准窗口镶边,然后如果您指定不想要玻璃框架,那么您可以指定 CornerRadius 属性来圆角您想要的任何角落。下载中包含一个示例项目,显示了不同属性的工作原理。

    该库是通过处理 WM_NCCALCSIZE(类似于 Office 自定义 chrome 的做法)来实现的,而不是使用分层窗口,这是 Window.AllowsTransparency 的完成方式。

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

    【讨论】:

    【解决方案3】:

    如果您只想剪掉圆角,您可以覆盖表单中的 OnPaint 并使用所需的窗口形状创建路径 (System.Drawing.Drawing2D.GraphicsPath),并将该路径分配给表单的 Region 属性。这有点笨拙,但它可能会做你想做的事。例如,对于统一的弯角,您可以这样做(vb,不是 C#,抱歉):

    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
    

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多