2015-12-01 13 views
6

私は、他のアプリケーション、WPFおよびWindowsフォームで再利用できるWindowsフォームダイアログを設計しました。これは、Windowsフォームアプリケーションで使用するとうまく動作しますが、WPFアプリケーションで呼び出されるとレイアウトの問題が発生します。サイズとサイズは、画面上のピクセル、WinFormsのAPIとSpy ++のピクセルから測定した場合、一貫性がありません。このウィンドウは、Spy ++よりもデバッガなしで実行すると、10ピクセル幅が広く、背が高いことがわかります。ここで何が問題なの?私は何も見つかりませんが、それはひどく壊れた.NET Frameworkだと言います。ダイアログには別のスペースが要求されていません

ここFormクラスのコードです:

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace DialogTestApp 
{ 
    internal class MyDialog : Form 
    { 
     public MyDialog() 
     { 
      Text = "Title"; 
      Width = 500; // -> actually 510 (Spy++ says 500) 
      Height = 300; // -> actually 310 (Spy++ says 300) 
      Font = SystemFonts.MessageBoxFont; 
      FormBorderStyle = FormBorderStyle.FixedDialog; 
      MaximizeBox = false; 
      MinimizeBox = false; 
      ShowInTaskbar = false; 
      StartPosition = FormStartPosition.CenterScreen; 

      TableLayoutPanel mainLayout = new TableLayoutPanel(); 
      mainLayout.BackColor = Color.FromArgb(255, 171, 255); // pink 
      mainLayout.Dock = DockStyle.Fill; 
      mainLayout.Margin = Padding.Empty; 
      mainLayout.Padding = Padding.Empty; 
      mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); // Only use minimum required space 
      mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); 
      Controls.Add(mainLayout); 

      int row = 0; 
      Label label = new Label(); 
      label.Text = "Hello world. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque suscipit vestibulum gravida."; 
      label.Font = new Font(Font.FontFamily, 12); 
      label.MaximumSize = new Size(mainLayout.Width, 0); 
      label.AutoSize = true; 
      label.Dock = DockStyle.Fill; 
      label.Margin = Padding.Empty; 
      label.BackColor = Color.FromArgb(58, 171, 58); // green 
      label.ForeColor = Color.White; 
      mainLayout.Controls.Add(label, 0, row++); 

      TextBox textBox = new TextBox(); 
      textBox.Dock = DockStyle.Fill; 
      textBox.Margin = Padding.Empty; 
      textBox.Multiline = true; 
      textBox.ScrollBars = ScrollBars.Both; 
      mainLayout.Controls.Add(textBox, 0, row++); 
     } 
    } 
} 

ただ、空のWPFアプリケーションプロジェクトにこのファイルを入れて、アプリケーションのコンストラクタから呼び出す:

public MainWindow() 
{ 
    InitializeComponent(); 

    new MyDialog().ShowDialog(); 
    Application.Current.Shutdown(); 
} 

ここでは、デバッガで見えるものです:

enter image description here

そしてなし:

enter image description here

追加ピンクのボーダーがあることになっていません10個のピクセルです。緑のラベルは、すべてのスペースを埋めるように設定されています。

+0

のWindows 10 ...問題はありません。 – Spawn

+0

あなたの**内部**クラスMyDialogは他のWPFプロジェクトでインスタンシエートすることはできません(友人のアセンブリでない限り)、別のクラスをインスタンス化していますか? –

+0

問題であるかどうかは不明ですが、 'label.AutoSize = true;'と 'label.DockStyle = DockStyle.Fill'は競合しています。 'AutoSize'は' Text'または 'Font'が変更されたときに' PreferredSize'にパックしようとします。 'DockStyle.Fill'は親コントロールの' LayoutEngine'によって使用されるヒントです。 – Loathing

答えて

2

TableLayoutPanel,Labelがなくても、System.Windows.Forms.Application.Run(new MyDialog())を使用しても、問題はまだ発生します。問題はFormBorderStyle = FormBorderStyle.FixedDialog;

ある原因になっている行は、ここで説明したのと同じ問題であるように思わ:Form tells wrong size on Windows 8 — how to get real size?

回避策:

 mainLayout.SizeChanged += delegate { 
      label.MaximumSize = new Size(mainLayout.Width, 0); 
      //MessageBox.Show("hi"); // called when not ran in debugger 
     }; 
+0

私は窓の実際のサイズについてはあまり気にしません。コンテンツに合う大きさでなければなりません。高いDPIシステムでは、とにかくわずかな違いがあります。それは私がフレキシブルなレイアウトコンテナを使うためのものです。しかし、サイズの値がクライアント領域自体で一貫していないこと、レイアウトによって一貫性のない値が生成されることは認められません。そして、私はデバッガの存在が何を変えるのか理解していません。 – ygoe

+0

@LonelyPixelしたがって、 'label.MaximumSize = new Size(mainLayout.Width、0);'行を削除してみてください。最大サイズが正しく計算されません(いくつかの視覚的要素が指摘されています)。 – Loathing

+0

動作しません。質問の更新されたコードを参照してください。 – ygoe

関連する問題