2016-07-10 20 views
-2

私は約1ヶ月前から奇妙なバグに直面しています。私は保存画像をクリック「配置」の後に無限大のWPFコントロールが消える

enter image description here

 var g = new Grid(); 
     var mv = new MyControl(); 
     g.Children.Add(mv); 
     g.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     g.Arrange(new Rect(g.DesiredSize)); 

     var rtb = new RenderTargetBitmap((int)g.ActualWidth, (int)g.ActualHeight, 
      96, 96, PixelFormats.Pbgra32); 
     rtb.Render(g); 

呼び出すと測定()と)(配置グリッドのサイズを設定します

私はこのようになりますフォームを持っています適切なサイズ(MyControlから取得) RenderTargetBitmapにレンダリングされるフォームコントロールとユーザーコントロールは共通のデータを共有しません。

表示されるビジュアルが表示され、ビューモデルデータが適切に設定されます。それはこのようになります。このコードを実行して、再度ダイアログを表示した後

:チェックボックスの

enter image description here

の両方がdisappeared.Whyを持っています! Gridため

私は(コードでvar g)グリッドのサイズを設定する場合、この問題は表示されません

 var g = new Grid() 
     { 
      Width = 1024, 
      Height = 768 
     }; 
+0

@flag for close ..私の質問ではっきりしないものはありますか? – Hristo

+0

あなたは答えを言った。新しいグリッドを作成する際には、 'Width'と' Height'を指定し、既存のグリッドに新しいコントロールを追加する必要があります。 – ViVi

+0

@ViViしかし、私はMeasure()とArrangeを呼び出します。 – Hristo

答えて

0

デフォルトRowDefinitionColumnDefinition1*です。つまり、コンテンツには十分なスペースが与えられていることを意味します(Grid)。この場合、Gridは親に利用可能な最大容量を与えるよう親に頼みます。

あなたの場合、Gridには視覚的な親がないため、自分自身をどれだけ大きくするべきか分かりません。明示的な幅/高さを与える必要があります。 MyControlの内容をビットマップに変換する場合は、Gridを付けないでください。

グリッドの使用を強くお勧めし、サイズが動的である場合は、RowDefinitionsColumnDefinitionsを手動で指定する必要があります。両方をautoに変更すると、グリッドはコンテンツのサイズに合わせてサイズ変更されます。

+0

コントロールは、 MEasure()とArrange()を呼び出すと、実行時のグリッドのサイズがNanではなく、生成された画像が正しいことを確認できます。 – Hristo

+0

@Chris次に、より多くのコードを提供する必要があります。これまでのところ、RenderTargetBitmapとUserControlの間のリンクがわかりません。また、「開く」とは何かを具体的に説明する必要があります。 – Jai

+0

フォームとレンダリングされるユーザーコントロールの間にリンクはありません。実際にはこれらの2つのプロパティを変更するだけです:幅と高さは、画像で描写した2つの結果の差です。 – Hristo

0

としてはMSDN info about Measure (Remarks section)に言った:

のWindows Presentation Foundationの (WPF)でのレイアウト位置の計算は、メジャー・コールアレンジコールで構成されています。 メジャーコール中、要素は availableSize入力を使用してサイズ要件を決定します。アレンジコール中に、要素のサイズは になります。

availableSizeには、ゼロから無限の任意の数値を使用できます。レイアウトに参加する要素 は、指定されたavailableSizeに対して が必要な最小サイズを返す必要があります。

レイアウトが最初にインスタンス化されると、配列の前に常に のメジャーコールが受信されます。ただし、最初のレイアウト・パスの後には、Measureなしでアライメント・コールを受信することがあります()。アライメントのみに影響するプロパティ が変更されたとき(アラインメントなど)、または 親がアレンジなしでアレンジを受信したときに発生する可能性があります。メジャーコールでは、 はアレンジコールを自動的に無効にします。

レイアウトの更新はasynchronouslyとなるため、メインスレッドは可能なすべてのレイアウト変更を待たずに になります。 プロパティ値のコードビハインドチェックによって要素を照会すると、サイジングまたはレイアウトの 特性(たとえばWidthプロパティ)とやりとりするプロパティの変更がすぐに反映されないことがあります。

UpdateLayoutメソッドを使用すると、レイアウトの更新を強制できます。 ただし、通常このメソッドを呼び出す必要はなく、 のパフォーマンスが低下する可能性があります。

したがって、画像を保存ボタンでg.UpdateLayoutをクリックしてください。

var g = new Grid(); 
var mv = new MyControl(); 
g.Children.Add(mv); 
g.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
g.Arrange(new Rect(g.DesiredSize)); 
g.UpdateLayout(); 

var rtb = new RenderTargetBitmap((int)g.ActualWidth, (int)g.ActualHeight, 
    96, 96, PixelFormats.Pbgra32); 
rtb.Render(g); 
+0

これは面白そうですが、それでも問題は解決しません(チェックボックスはまだありません)。 – Hristo

+0

問題を分析するコードがさらに必要です。または、最初のシナリオxamlコードと画像ボタンのクリックコードを比較します。あなたが設定しようと思っていたかもしれないプロパティがあります。 – ViVi

関連する問題