2012-01-09 2 views
1

У меня есть проект WPF, и главное окно должно иметь закругленные углы. Я могу сделать это в настоящее время, установив AllowTransparency = True. Таким образом, белый фон вблизи закругленных углов становится прозрачным.AllowTransparency альтернатива для закругленных краевых форм

Однако AllowTransparency является медленным и багги. В частности, есть проблема known, где AllowTransparency сильно нарушена, и MS отказывается исправлять ее - и это влияет на моих клиентов. Также исправление MS предложило исправление в лучшем случае, поэтому это также не вариант.

Кажется, у меня есть два варианта: 1) просто отключите AllowTransparency и увидьте уродливую форму или 2) найдите обходной путь, чтобы иметь закругленные края без AllowTransparency.

StackO можно ли иметь закругленные края с AllowTransparency = False в проекте WPF? Благодарю.

+1

Вы пробовали исправление, предлагаемое компанией Microsoft? – dowhilefor

+2

3) Почувствуйте себя в ваших клиентах? Или у них есть области отображения с круглыми углами? –

+0

@dowhilefor Да, я испробовал исправление, и это противоречиво. Это также не то, что мы хотим, чтобы клиенты должны были делать. – kmarks2

ответ

1

Я написал библиотеку некоторое время назад, что делает это: http://archive.msdn.microsoft.com/WPFShell.

Он предоставляет прикрепленное свойство WindowChrome для Window, которое избавляется от стандартного окна хром, а затем, если вы укажете, что вам не нужен стеклянный фрейм, вы можете указать свойство CornerRadius для округления любого из углов, которые вы хотите , В загрузке есть образец проекта, который показывает, как работают разные свойства.

Библиотека реализована обработкой WM_NCCALCSIZE (аналогично тому, что делает Office для настройки chrome), вместо использования многоуровневых окон, как это делает Window.AllowsTransparency.

Ссылка на немного старую версию библиотеки, но большинство ошибок, которые я исправил с тех пор, я думаю, не повлияет на вас, поскольку звучит так, будто вы не используете стекло.

+0

В Microsoft Ribbon для WPF существует более новая версия Microsoft.Windows.Shell.dll. Посмотрите эту тему: http://archive.msdn.microsoft.com/WPFShell/Thread/View.aspx?ThreadId=4337 – TGasdf

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 
Смежные вопросы