2012-01-09 16 views
1

私はWPFプロジェクトを持っており、メインウィンドウには角が丸くなっている必要があります。 AllowTransparency = Trueを設定することで、これを行うことができます。このようにして、丸い角の近くの白い背景が透明になります。丸みを帯びたエッジフォームの代替透過を実現

ただし、AllowTransparencyは遅く、バグがあります。特にknownにはAllowTransparencyがひどく壊れており、MSはそれを修正することを拒否しており、それは顧客に影響を与えます。また、MS提案の修正プログラムはせいぜい矛盾しているので、これもオプションではありません。

私は2つの選択肢があります:1)単にAllowTransparencyをオフにして、醜い形をしているか、2)AllowTransparencyを使わずに端を丸めるための回避策を見つけてください。

StackOでは、WPFプロジェクトでAllowTransparency = Falseを使用して四角形を丸めることは可能ですか?ありがとう。

+1

Microsoftが提案した修正プログラムを試しましたか? – dowhilefor

+2

3)あなたのクライアントにいくつかの意味を打つ?または、コーナーが丸い表示領域がありますか? –

+0

@dowhileforはい、私は修正プログラムを試しましたが、矛盾しています。また、クライアントがしなければならないものでもありません。 – kmarks2

答えて

1

これまでのところ、これは:http://archive.msdn.microsoft.com/WPFShellという書庫を書いています。

標準のウィンドウクロムを取り除くWindowChrome添付プロパティを公開しています。ガラスフレームが不要であると指定した場合は、CornerRadiusプロパティを指定して、必要なコーナーのいずれかを丸めます。ダウンロードには、さまざまなプロパティの仕組みを示すサンプルプロジェクトが含まれています。

ライブラリは、Window.AllowsTransparencyがどのように行われるかという階層化ウィンドウを使用するのではなく、WM_NCCALCSIZE(Officeがクロムをカスタマイズするのと同様)を処理することによって実装されます。

このリンクは少し古いバージョンのライブラリですが、その後修正されたバグのほとんどは、あなたがガラスを使用していないようなので、あなたには影響しません。

+0

WPFのMicrosoftリボンには、新しいバージョンのMicrosoft.Windows.Shell.dllがあります。 このスレッドを参照してください:http://archive.msdn.microsoft.com/WPFShell/Thread/View.aspx?ThreadId=4337 – TGasdf

0

ラウンドコーナーを外したい場合は、フォームのOnPaintをオーバーライドし、必要なウィンドウシェイプを持つパス(System.Drawing.Drawing2D.GraphicsPath)を作成し、そのパスをフォームのRegionプロパティに割り当てます。これは少しclunkyですが、それはあなたが欲しいものを行う可能性があります。たとえば、均一な曲線コーナーを作成するには、次のようにします(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 
関連する問題