2009-06-01 9 views
2

現在、私はtranspareny効果に依存するWinformsアプリケーションを持っています。しかし、これは後ろの諺に絶対的な痛みであることが判明しています!イム学習としてWinformsは、特に透明性を扱っていません。C#Winforms-WPF interop

透明ビットとWPFコンポーネントをWPFコンポーネントで使用する方が簡単かどうかは分かりませんでした(WPFにアプリケーション全体を移動するのが好きですが、現実的ではありません)。私はWPFについては何も知らないので、ここでは理由はわかります!私はconsidereingいたものだった。

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-Controlの親でコードを呼び出せるようにします。

まず第一に、物事...

  • はこれを行うために合理的なものですか私は間違ってツリーを吠えていますか?
  • これは簡単な方法で実現できますか?
  • 誰でも私をここで助けることができますか?
  • 最後に、私にa)WPFを学び、b)自立するのに役立つオンラインリソースはありますか?
+1

@TK:WPFとWinformsを混在させた透明度のレンダリングは問題であり、その解決可能かどうかはわかりません。 WPFとWinFormsは根本的に異なります。私は、相互にホストすることができますが、オーバーレイされたコンポーネントは正確にはレンダリングされないことを、どこか読んで思い出しています。彼らは明確な地域を必要とします。私はアダム・ネイサンの本でそのことを読んでいると信じていますが、ここには言及していないので、間違って覚えている可能性があります。 –

+0

@Greg D:あなたは絶対に正しいと信じています。問題は、各コントロール(WPFまたはWinforms)が独自の空域を必要とすることです。これは、任意の時点で、画面上のピクセルがWPFピクセルまたはWinformピクセルのいずれかであり、その2つのハイブリッドではないことを意味します。私はWinformsコンポーネントをBMPファイルとしてレンダリングしてから、別のコントロールのバックグラウンドとしてbmpファイルをレンダリングすることでこの問題を解決しました。メッシー...はい、それは十分にうまくいくようです。 –

+0

賢明なアプローチ。あなたの質問への答えでブレンド効果のビットマップとしてレンダリングするために、winformsコントロールをどのように入手したのかを投稿できますか? :) winformsコントロールの変更をキャプチャし、ビットマップを適切に更新するか、または透過効果の間にwinformsが静的を制御していますか? –

答えて

1

ここに私が手で問題を解決するために使った解決策があります。このソリューションは、コントロールをオーバーレイすることによってParentをビットマップイメージとしてレンダリングします。これはオーバーレイコントロールの背景として描画されます。これは、WinFormsのドメイン内で純粋に行われ

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); 
    } 

} 

、しかし私は必要としてレンダリングするためにWPFコントロールにこのビットマップ画像を渡すことも可能かもしれないと考えています。現在、親が変更されたときにBitmapを更新する手段はありませんが、ビットマップをクリアしてOverlayngコントロールを再描画するカスタムメソッドを作成するのは簡単です。私が気づいた優雅な解決策ではありませんが、十分に機能するようです。

4

確かに可能ですが、透明性をもって作業するのが最も簡単な方法だと思います。私はそれを自分自身を試していない

but according to this article on CodeProjectは、それは非常に簡単でなければなりません。 WPFコンテンツをホストするには、ElementHost controlを使用する必要があります。 WinFormsコントロールにWPFをホスティング

は、フレームワークに組み込まれた機能はサポートシナリオです。そうすることに問題はないはずです。また、WPFアプリケーションでWinFormsをホストする別の方法に進むためのWPFコンポーネントもあります。

+0

リンクをありがとう...その本当に助けられた!唯一の問題は、現在、WPFで透明度をレンダリングして、Winformsコントロールを下に表示することです。現時点では完全に不透明です。 –

関連する問題