Альтернатива AllowTransparency для округлых краевых форм - PullRequest
1 голос
/ 09 января 2012

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 января 2012

Может быть, это поможет?http://www.kirupa.com/blend_wpf/custom_wpf_windows.htm (все еще с AllowTransparency) Или вот это: http://www.codeproject.com/KB/WPF/CustomWPFWindow.aspx

1 голос
/ 09 января 2012

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

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

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

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

0 голосов
/ 09 января 2012

Если вы просто хотите вырезать закругленные углы, вы можете переопределить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...