2013-04-12 34 views
6

Tôi đã chuyển sang VS 2012 ngày hôm qua từ VS 2010 và tất cả dường như cũng tốt ngoại trừ điều này.Chuyển sang VS 2012 và bây giờ biểu mẫu không thay đổi kích thước đúng cách?

Tôi có một nút trên biểu mẫu của tôi khi nhấn mở rộng chiều rộng của biểu mẫu để hiển thị các điều khiển bổ sung. Nhấn nút một lần nữa và nó làm giảm chiều rộng để ẩn những điều khiển. Bây giờ tất cả điều này làm việc tuyệt vời trong VS 2010 và cũng hoạt động tốt khi tôi gỡ lỗi trong VS 2012 nhưng ngay sau khi tôi xuất bản hoặc biên dịch dự án và mở .exe khi bạn nhấp vào nút, nó thêm 5 đến chiều rộng thay vì 100+ cần. Tôi nhấp vào nó một lần nữa và sau đó nó sẽ thay đổi nó thành 372 như nó cần và cho thấy tất cả các điều khiển của tôi. Tôi nhấp vào nó một lần nữa để ẩn các điều khiển và nó ẩn các điều khiển một phần (đi đến 188 + bí ẩn 5) Tôi hy vọng tất cả điều này có ý nghĩa và tôi hy vọng có một cách tốt hơn để chạy quá trình tôi cần.

Đây là mã tôi hiện đang làm việc và tôi không thay đổi bất cứ điều gì giữa chuyển đổi từ năm 2010 đến năm 2012. Thực tế, nếu tôi mở giải pháp này vào năm 2010 và xuất bản mọi thứ hoạt động tốt.

private void button1_Click(object sender, EventArgs e) 
    { 
     if (this.Width == 188) 
     { 
      this.Width = 372; 
      this.Height = 540; 
      progressBar.Value = 100; 
      copied_status.Text = ("Output View Enabled"); 
     } 
     else 
     { 
      progressBar.Value = 100; 
      copied_status.Text = ("Output View Disabled"); 
      this.Width = 188; 
      this.Height = 540; 
     } 

     if (this.Width == 372) 
     { 
      button1.Text = "<<"; 
     } 
     else 
      button1.Text = ">>"; 

    } 
+0

Điều gì sẽ xảy ra nếu bạn nhấn Shift + F5? –

+0

@ofstream Xin cảm ơn vì đã trả lời. Bạn không chắc chắn tôi làm theo? Tất cả mọi thứ hoạt động tốt trong khi gỡ lỗi và hành động theo cách nó nên. Khi tôi xuất bản chương trình và mở tập tin được biên dịch là khi nó không làm những gì nó cần. Tôi nhấn shift + f5 trong vs trong khi gỡ lỗi và nó chỉ dừng trình gỡ lỗi – Nabbic

+0

Chỉ là một dự đoán hoang dã, nhưng hãy kiểm tra tập tin cấu hình của một xuất bản, chắc chắn rằng nó đang được công bố. – AaronLS

Trả lời

12

Chiều rộng của biểu mẫu của bạn không phải là 188 pixel trong một thời gian dài. Bây giờ với VS2012, Windows cuối cùng đã ngừng nói dối về nó.

Vấn đề là đường viền cửa sổ chất béo trong Aero. Họ là một vấn đề cực kỳ phức tạp khi tính năng này được giới thiệu trong Vista. Rất cần thiết vì hai điểm ảnh đó trở nên khó đánh bằng chuột. Nhưng mạnh mẽ không tương thích với cách một ứng dụng tạo ra một cửa sổ. Nó yêu cầu kích thước cửa sổ cụ thể, kích thước bên ngoài, đối số nWidth và nHeight của hàm CreateWindow(). Nhưng những gì thực sự quan trọng là kích thước của khu vực khách hàng, một phần của cửa sổ bên trong biên giới. Nếu Microsoft không làm điều gì đó về nó, các ứng dụng cũ sẽ kết thúc với một khu vực khách hàng quá nhỏ. Có vẻ rất xấu, nội dung cửa sổ sẽ không còn phù hợp nữa. Một điều khiển đối với phía dưới hoặc bên phải của biểu mẫu sẽ không được hiển thị hoàn toàn ví dụ.

Vì vậy, lén lút, Aero làm cho cửa sổ lớn hơn bởi chiều rộng thêm của đường viền chất béo. Và khi ứng dụng yêu cầu kích thước cửa sổ, nó lén lút nói rằng nó nhỏ hơn bởi cùng chiều rộng được thêm vào. Các ứng dụng không biết tốt hơn so với nó vẫn đang chạy với kích thước cửa sổ tương tự nó đã có trên XP. Điều này hoạt động khá tốt, nhưng không chính xác lý tưởng. Khó có được các cạnh cửa sổ để căn chỉnh đúng cách với lời nói dối đó chẳng hạn.

Có hoặc không Aero sẽ nói dối về kích thước cửa sổ dựa trên hệ điều hành đích được ghi trong tiêu đề EXE. Khi nó nhìn thấy một phiên bản cũ hơn sau đó 6.00, số phiên bản Vista, sau đó nó sẽ giả định rằng EXE của bạn là một chương trình di sản mà không biết về tính năng biên giới chất béo. Vì vậy, cần phải nói dối. Bạn đã chạy với số phiên bản đích đó được đặt là 4.00 trong một thời gian dài, nó được viết bởi trình biên dịch .NET khi nó xây dựng chương trình của bạn. Bạn có thể xem nó với dumpbin.exe /headers yourapp.exe.

Điều này cuối cùng đã thay đổi trong VS2012 và .NET 4.5. Đây là phiên bản .NET không có trong XP. Trình biên dịch cuối cùng có thể đưa ra giả định rằng XP là lịch sử và bạn sẽ chạy trên một phiên bản Windows có hỗ trợ Aero. Vì vậy, nó đặt phiên bản Windows mục tiêu trong tiêu đề EXE đến 6.00. Tương ứng, Aero giờ sẽ dừng nói dối về kích thước cửa sổ. Bạn nhận được một thực tế, không phải là một giả.

Vì vậy, khắc phục nhanh là thay đổi phiên bản .NET framework mục tiêu thành 4.0. Đó là có sẵn trên XP, do đó bạn sẽ nhận được nói dối một lần nữa.

Tất nhiên, tốt hơn là sửa mã của bạn. Không bao giờ sử dụng thuộc tính Kích thước, Chiều rộng hoặc Chiều cao, chúng chắc chắn sẽ phụ thuộc vào kích thước đường viền và chú thích. Sử dụng thuộc tính ClientSize thay vào đó, đó là thuộc tính ổn định và thuộc tính bạn thực sự quan tâm.Nhưng hãy cẩn thận với tài sản đó, một hình thức có thể rescale khi nó chạy trên một máy có bộ điều hợp video của nó thiết lập đến hơn 96 chấm trên mỗi inch. Một tính năng khác rất dễ truy cập trong Vista trở lên. Thay đổi tỷ lệ thay đổi ClientSize tương ứng theo cài đặt DPI.

Sửa lỗi thực tế là sử dụng trường bool thay vì theo dõi trạng thái cửa sổ. Và đặt thuộc tính ClientSize dựa trên vị trí của điều khiển bạn muốn ẩn hoặc tiết lộ. Vì vậy, khoảng:

private bool enlarged; 

private void button1_Click(object sender, EventArgs e) 
{ 
    enlarged = !enlarged; 
    int width = someControl.Left - 5; 
    if (enlarged) width = someControl.Right + 5; 
    this.ClientSize = new Size(width, this.ClientSize.Height); 
} 

Thay thế someControl trong mã này bằng tên điều khiển của bạn.

Các vấn đề liên quan