2012-01-09 102 views
1

我有一個WPF項目,主窗口需要圓角。我可以通過設置AllowTransparency = True來完成此操作。這樣,圓角附近的白色背景變得透明。AllowTransparency替代圓角邊框形式

但是,AllowTransparency緩慢而且有問題。特別是有一個known問題,其中AllowTransparency嚴重損壞,MS拒絕修復它 - 這會影響我的客戶。此外,MS建議最佳修補程序不一致,所以這也不是一個選項。

看來我有兩種選擇:1)只需關閉AllowTransparency並有一個悲慘醜陋的形式或2)找到一個解決方法,使圓邊沒有AllowTransparency。

StackO是否可以在WPF項目中具有AllowTransparency = False的圓角邊緣?謝謝。

+1

您是否嘗試過微軟提出的修補程序? – dowhilefor 2012-01-09 15:17:24

+2

3)打敗你的客戶?或者他們的展示區域是否有圓角? – 2012-01-09 15:17:55

+0

@dowhilefor是的,我試過修補程序,它不一致。這也不是我們希望客戶必須做的事情。 – kmarks2 2012-01-09 15:18:52

回答

1

我寫了一個庫,前一段時間這樣做:http://archive.msdn.microsoft.com/WPFShell

它爲Window提供了一個WindowChrome附加屬性,用於擺脫標準窗口鑲邊,然後如果您指定不需要一個玻璃框架,那麼您可以指定一個CornerRadius屬性以繞過您想要的任何角落。下載中包含一個示例項目,顯示不同屬性的工作方式。

該庫是通過處理WM_NCCALCSIZE(類似於Office自定義chrome的操作)來實現的,而不是使用分層窗口,這就是Window.AllowsTransparency的完成方式。

鏈接是稍微舊版本的庫,但我認爲自從那時起我修復的大多數錯誤都不會影響你,因爲它聽起來像你不使用玻璃。

+0

在Microsoft Ribbon for WPF中有更新的Microsoft.Windows.Shell.dll版本。 看到這個主題:http://archive.msdn.microsoft.com/WPFShell/Thread/View.aspx?ThreadId=4337 – TGasdf 2012-05-30 10:06:09

0

如果您只是想將圓角修剪出來,可以在窗體中重寫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