2017-11-14 1 views
2

이것은 매우 이상합니다. VS2008에서 잘 작동하는 프로젝트를 이식했지만 VS2017로 빌드하면 한 줄의 존재로 인해 대화 상자의 크기가 조정됩니다. 코드를 실행하지 않아도되고 서브 루틴에 있어야합니다. 운영! 이 동작을 나타낼 수있는 가장 간단한 버전의 프로그램을 만들었습니다. 다른 버전의 Visual Studio에서 제작/실행 해보십시오. 이 문제가 발생하는 이유와 해결 방법에 대한 설명을 모두 좋아합니다. 감사.VS2017에서 대화 상자 크기 변경

using System; 
using System.IO; 
using System.Windows.Forms; 
using System.Windows.Media.Imaging; // Need reference to PresentationCore 

namespace Test2017 
{ 
    public class MainDlg : Form 
    { 
     [STAThread] 
     static void Main() { Application.Run(new MainDlg()); } 

     public MainDlg() 
     { 
      SuspendLayout(); 
      var button = new Button { Location = new System.Drawing.Point(7, 56), Size = new System.Drawing.Size(263, 23), Text = "Note size before and after clicking" }; 
      button.Click += Button_Click; 
      ClientSize = new System.Drawing.Size(282, 253); 
      Controls.Add(button); 
      ResumeLayout(false); 
      PerformLayout(); 
     } 

     private void Button_Click(object sender, EventArgs e) 
     { 
      if (DateTime.Today.Year != 1234) return; // This will always return 
      try 
      { 
       // The following is never executed - but its very presence causes the dialog to shrink when running under VS2017 
       BitmapFrame.Create((FileStream)null); // Was using this to get metadata - that part works ok 
       MessageBox.Show("Success"); 
      } 
      catch { MessageBox.Show("Exception"); } 
     } 
    } 
} 
+0

2012 년과 2017 년에이 코드를 실행하면 어느 버전에서든 양식의 크기가 "크기가 조정되지"않습니다. – LarsTech

+0

죄송합니다. 모든 컴퓨터에서 발생하지는 않지만 매우 자주 발생하는 컴퓨터에서는 일관된 것처럼 보입니다. 한스 패서트 (Hans Passant)의 팁으로이 문제를 해결할 수 있는지 알게 될 것입니다 ... –

답변

4

BitmapFrame은 항상 WPF 응용 프로그램에서 사용되는 PresentationCore 어셈블리에서 가져온 클래스입니다. 그것에는 프로그램 dpiAware를 자동으로 만드는 모듈 이니셜 라이저가 있습니다. dpiAware는 WPF 앱에 매우 중요합니다. 그리고 Winforms 앱의 경우 be a feature으로되어 있지만 수동으로 켜야합니다.

C# 언어는 module initializers을 지원하지 않습니다. 그것은 대략적으로 정적 생성자와 비슷하지만 어셈블리가로드 될 때 실행됩니다. 어셈블리는 just-in-time 컴파일러에 의해로드됩니다. 그 이유는 현재 선언문에 차이가있어 실행하는 것이 중요하지 않은 것처럼 보이는 이유입니다.

그래서 문제를 피하는 가장 좋은 방법은 앱이 dpiAware 인 지 확인한 다음으로 첫 번째 창을 생성하는 것입니다. 링크를 따라 매니페스트를 수정하는 방법을 알아보세요. 이 윈폼에서 dpiAware 코드를 작성, dpiAware 될 바람직하지 않은 경우에 당신은이 코드를 붙여 PresentationCore가 무엇을 해제 할 수 있습니다, 그 직관적되지 않습니다 : WindowsBase에 대한 참조를 추가 할 필요

[assembly:System.Windows.Media.DisableDpiAwareness] 

. 어디서나 원하는 곳에 넣을 수 있습니다. AssemblyInfo.cs는 매우 논리적 인 곳입니다.

+0

PresentationCore가 WPF에만 해당되며 WinForms 응용 프로그램에서 사용할 때 불쾌한 부작용이있을 수 있다는 것을 몰랐습니다. 이 정보를 바탕으로 내가 찾고 있던 이미지 메타 데이터를 가져 오는 또 다른 방법을 찾았습니다. 그래서 팁을 사용하지는 않겠지 만, 문제를 설명하고 해결책을 지적한 이후로 나는 당신의 대답을 투표 할 것입니다. –