C# Winforms と WPF の相互運用性
-
06-09-2019 - |
質問
現在、透明効果に依存する Winforms アプリを持っています。しかし、これは前段階のビハインドにとって絶対的な苦痛であることが判明しています。私が学んでいる Winforms は、透明性を特にうまく扱っていません。
透明部分に WPF コンポーネントを使用し、残りの部分に winforms を使用すると、これがもっと簡単になるかどうか疑問に思っていました (アプリ全体を WPF に移行したいと考えていますが、これは実現不可能であることに注意してください)。私は WPF についてはほとんど何も知らないので、ここに来たのです。私が検討していたのは次のとおりです。
1) Winforms ユーザー コントロール内で WPF コンポーネントをホストします。WPF コントロールの例:
<UserControl x:Class="WindowsFormsApplication1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<Grid>
<Rectangle Name="rectangle1" Stroke="White" Fill="Black" RadiusX="10" RadiusY="10" Opacity="0.7" />
<Rectangle Margin="57,101,43,99" Name="dialog" Stroke="Gray" Fill="White" RadiusX="10" RadiusY="10" />
</Grid>
</UserControl>
2) WPF コントロールの白い四角形 (ダイアログ) 内に Winforms ユーザー コントロール (コンテンツ) をホストします。3) コンテンツ (Winforms ユーザー コントロール) が WPF コントロールの親のコードを呼び出すことを許可します。
まず最初に...
- これは合理的な行為なのでしょうか、それとも私が間違った木に吠えているのでしょうか?
- これをもっと簡単な方法で実現できないでしょうか?
- 誰かここで助けてくれませんか?(サンプルコードをいただければ幸いです!)
- ついに ...a) WPF を学習し、b) より自立できるようになるのに役立つオンライン リソースはありますか?
解決 2
ここで私は、当面の問題を解決するために使用されるソリューションです。このソリューションは、ビットマップ画像としてその親をレンダリングするためにオーバーレイコントロールに依存しています。これは、その後、オーバーレイコントロールの背景として描かれます。
public class OverlayingControl : UserControl
{
/// <summary>
/// Overrides the c# standard Paint Background to allow the custom background to be drawn
/// within the OnPaint function
/// </summary>
///
/// <param name="e">Arguements used within this function</param>
protected override void OnPaintBackground( PaintEventArgs e )
{
//Do Nothing
}
protected override void OnPaint( PaintEventArgs e )
{
// Render the Parents image to a Bitmap. NB: bitmap dimensions and Parent Bounds can be changed to achieve the desitred effect
Bitmap background = new Bitmap( Width, Height, PixelFormat.Format64bppArgb );
Parent.DrawToBitmap( background, Parent.Bounds );
// Paint background image
g.DrawImage( background, 0, 0, new RectangleF( Location, Size ), GraphicsUnit.Pixel );
// Perform any alpha-blending here by drawing any desired overlay e.g.
// g.FillRectangle( new SolidBrush( semiTransparentColor ), Bounds);
}
}
これは純粋にWinFormsのドメイン内で実行され、しかし、私は必要としてレンダリングするためにWPFコントロールにこのビットマップ画像を渡すことも可能かもしれないと考えています。現在、親の変更は、しかし、ビットマップをクリアし、Overlayngコントロールを再描画するカスタムメソッドを作成するのは簡単であるべきビットマップを更新するための規定はありません。私が実現...しかし、十分に機能するように表示されます。
ではないエレガントなソリューション他のヒント
これは確かに可能である、と私はあなたがそれが透明で動作する最も簡単な方法であろうと、右だと思います。
私はそれを自分で試していませんが、が、CodeProjectのこの記事によると、それは非常に簡単でなければなりません。あなたは ElementHostコントロールを使用する必要がありますするあなたのWPFコンテンツをホストします。
のWinFormsコントロールにWPFをホスティングすることはサポートされたシナリオ、フレームワークに組み込まれた機能です。だから、そうすることで問題はありません。 WPFアプリでリサイズをホスティングして、他の道を行くためのWPFコンポーネントもあります。