Làm cách nào để viết mã WinForms tự động chia tỷ lệ cho cài đặt phông chữ và phông chữ hệ thống?


143

Giới thiệu: Có rất nhiều ý kiến ​​cho rằng "WinForms không tự động điều chỉnh tỷ lệ cài đặt DPI / phông chữ tốt; chuyển sang WPF." Tuy nhiên, tôi nghĩ rằng nó dựa trên .NET 1.1; có vẻ như họ thực sự đã làm rất tốt việc triển khai tự động mở rộng trong .NET 2.0. Ít nhất là dựa trên nghiên cứu và thử nghiệm của chúng tôi cho đến nay. Tuy nhiên, nếu một số bạn ngoài kia biết rõ hơn, chúng tôi rất muốn nghe từ bạn. (Xin đừng bận tâm đến việc chúng ta nên chuyển sang WPF ... đó không phải là một lựa chọn ngay bây giờ.)

Câu hỏi:

  • Điều gì trong WinForms KHÔNG tự động điều chỉnh tỷ lệ đúng cách và do đó nên tránh?

  • Các hướng dẫn thiết kế nên lập trình viên tuân theo khi viết mã WinForms sao cho nó sẽ tự động mở rộng quy mô?

Nguyên tắc thiết kế chúng tôi đã xác định cho đến nay:

Xem cộng đồng wiki trả lời dưới đây.

Có bất kỳ trong số đó không chính xác hoặc không đầy đủ? Bất kỳ hướng dẫn khác chúng ta nên áp dụng? Có bất kỳ mô hình khác cần phải tránh? Bất kỳ hướng dẫn khác về điều này sẽ được đánh giá rất cao.

Câu trả lời:


127

Các điều khiển không hỗ trợ mở rộng đúng cách:

  • Labelvới AutoSize = FalseFontđược thừa hưởng. Hoàn toàn thiết lập Fonttrên điều khiển để nó xuất hiện in đậm trong cửa sổ Thuộc tính.
  • ListViewchiều rộng cột không quy mô. Ghi đè biểu mẫu ScaleControlđể làm điều đó thay vào đó. Xem câu trả lời này
  • SplitContainer's Panel1MinSize, Panel2MinSizeSplitterDistanceđặc tính
  • TextBoxvới MultiLine = TrueFontđược thừa hưởng. Hoàn toàn thiết lập Fonttrên điều khiển để nó xuất hiện in đậm trong cửa sổ Thuộc tính.
  • ToolStripButtonhình ảnh của. Trong biểu mẫu của hàm tạo:

    • Bộ ToolStrip.AutoSize = False
    • Đặt ToolStrip.ImageScalingSizetheo CreateGraphics.DpiX.DpiY
    • Đặt ToolStrip.AutoSize = Truenếu cần.

    Đôi khi AutoSizecó thể để lại Truenhưng đôi khi nó không thể thay đổi kích thước mà không có các bước đó. Hoạt động mà không có thay đổi với .NET Framework 4.5.2EnableWindowsFormsHighDpiAutoResizing.

  • TreeViewhình ảnh của. Đặt ImageList.ImageSizetheo CreateGraphics.DpiX.DpiY. Đối với StateImageList, hoạt động mà không có thay đổi với .NET Framework 4.5.1EnableWindowsFormsHighDpiAutoResizing.
  • FormKích thước của. Chia tỷ lệ cố định kích thước Formthủ công sau khi tạo.

Hướng dẫn thiết kế:

  • Tất cả ContainerControls phải được đặt thành giống nhau AutoScaleMode = Font. (Phông chữ sẽ xử lý cả thay đổi DPI và thay đổi đối với cài đặt kích thước phông chữ hệ thống; DPI sẽ chỉ xử lý các thay đổi DPI, không thay đổi cài đặt kích thước phông chữ hệ thống.)

  • Tất cả ContainerControls cũng phải được đặt giống nhau AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);, giả sử 96dpi (xem viên đạn tiếp theo) và Phông chữ mặc định của MS Sans Serif (xem viên đạn hai xuống). Đó là tự động được thêm bởi nhà thiết kế dựa trên DPI mà bạn mở nhà thiết kế trong ... nhưng bị thiếu trong nhiều tệp thiết kế lâu đời nhất của chúng tôi. Có lẽ Visual Studio .NET (phiên bản trước VS 2005) đã không thêm nó đúng cách.

  • Làm tất cả các nhà thiết kế của bạn làm việc trong 96dpi (chúng tôi có thể chuyển sang 120dpi; nhưng sự khôn ngoan trên internet nói rằng hãy bám lấy 96dpi; thử nghiệm là theo thứ tự; theo thiết kế, nó không quan trọng vì nó chỉ thay đổi AutoScaleDimensionsdòng nhà thiết kế chèn). Để đặt Visual Studio chạy ở mức 96dpi ảo trên màn hình độ phân giải cao, hãy tìm tệp .exe của nó, nhấp chuột phải để chỉnh sửa các thuộc tính và trong Tương thích, chọn "Ghi đè hành vi chia tỷ lệ DPI cao. Thu nhỏ được thực hiện bởi: System".

  • Hãy chắc chắn rằng bạn không bao giờ đặt Phông chữ ở cấp độ chứa ... chỉ trên các điều khiển lá HOẶC trong hàm tạo của Biểu mẫu cơ sở nhất của bạn nếu bạn muốn Phông chữ mặc định trên toàn ứng dụng khác với MS Sans Serif. (Đặt Phông chữ trên Container dường như tắt tính năng tự động mở rộng của vùng chứa đó vì nó xuất hiện theo thứ tự bảng chữ cái sau khi cài đặt AutoScaleMode và AutoScaleDimensions.) LƯU Ý rằng nếu bạn thay đổi Phông chữ trong hàm tạo của Biểu mẫu cơ sở nhất của bạn, điều đó sẽ gây ra AutoScaleDimensions của bạn để tính toán khác với 6x13; cụ thể, nếu bạn thay đổi thành Segoe UI (phông chữ mặc định Win 10), thì nó sẽ là 7x15 ... bạn sẽ cần phải chạm vào mọi Biểu mẫu trong Trình thiết kế để có thể tính toán lại tất cả các kích thước trong tệp .designer đó, bao gồm cái AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);.

  • KHÔNG sử dụng Neo Righthoặc Bottomneo vào UserControl ... định vị của nó sẽ không tự động chia tỷ lệ; thay vào đó, thả một Bảng điều khiển hoặc thùng chứa khác vào UserControl của bạn và neo các Điều khiển khác của bạn vào Bảng đó; có việc sử dụng Bảng điều chỉnh Dock Right, Bottomhoặc Filltrong UserControl của bạn.

  • Chỉ các điều khiển trong danh sách Điều khiển khi ResumeLayoutở cuối cuộc InitializeComponentgọi sẽ được tự động điều chỉnh ... nếu bạn tự động thêm điều khiển, thì bạn cần phải SuspendLayout(); AutoScaleDimensions = new SizeF(6F, 13F); AutoScaleMode = AutoScaleMode.Font; ResumeLayout();điều khiển đó trước khi thêm nó vào. Và định vị của bạn cũng sẽ cần được điều chỉnh nếu bạn không sử dụng chế độ Dock hoặc Trình quản lý bố cục như FlowLayoutPanelhoặc TableLayoutPanel.

  • Các lớp cơ sở có nguồn gốc từ ContainerControl nên AutoScaleModeđược đặt thành Inherit(giá trị mặc định được đặt trong lớp ContainerControl; nhưng KHÔNG được đặt mặc định bởi nhà thiết kế). Nếu bạn đặt nó thành bất cứ thứ gì khác, và sau đó lớp dẫn xuất của bạn cố gắng đặt nó thành Phông chữ (như bình thường), thì hành động thiết lập đó Fontsẽ xóa cài đặt của nhà thiết kế AutoScaleDimensions, dẫn đến thực sự tắt chế độ tự động mở rộng! (Hướng dẫn này kết hợp với hướng dẫn trước có nghĩa là bạn không bao giờ có thể khởi tạo các lớp cơ sở trong một nhà thiết kế ... tất cả các lớp cần phải được thiết kế như các lớp cơ sở hoặc như các lớp lá!)

  • Tránh sử dụng Form.MaxSizetĩnh / trong Trình thiết kế. MinSizeMaxSizetrên Mẫu không quy mô nhiều như mọi thứ khác. Vì vậy, nếu bạn thực hiện tất cả công việc của mình trong 96dpi, thì khi ở DPI cao hơn, bạn MinSizesẽ không gây ra sự cố, nhưng có thể không hạn chế như bạn mong đợi, nhưng bạnMaxSize có thể giới hạn tỷ lệ Kích thước của bạn, có thể gây ra sự cố. Nếu bạn muốn MinSize == Size == MaxSize, đừng làm điều đó trong Trình thiết kế ... hãy làm điều đó trong hàm tạo hoặc OnLoadghi đè của bạn ... đặt cả hai MinSizeMaxSizethành Kích thước được chia tỷ lệ chính xác của bạn.

  • Tất cả các Điều khiển cụ thể Panel hoặc Containernên sử dụng Neo hoặc Docking. Nếu bạn trộn chúng, tự động thay đổi tỷ lệ được thực hiện bởi điều đó Panelthường sẽ hoạt động sai theo những cách kỳ quái tinh tế.

  • Khi tự động điều chỉnh tỷ lệ, nó sẽ cố gắng mở rộng Biểu mẫu tổng thể ... tuy nhiên, nếu trong quá trình đó, nó chạy đến giới hạn trên của kích thước màn hình, đó là giới hạn cứng có thể vặn lên (clip) tỉ lệ. Do đó, bạn nên đảm bảo tất cả các Biểu mẫu trong Trình thiết kế ở mức 100% / 96dpi có kích thước không lớn hơn 1024x720 (tương ứng với 150% trên màn hình 1080p hoặc 300% là giá trị được đề xuất của Windows trên màn hình 4K). Nhưng bạn cần phải trừ đi thanh tiêu đề / chú thích Win10 khổng lồ ... để có kích thước tối đa 1000x680 ... trong trình thiết kế sẽ giống như 994x642 ClientSize. (Vì vậy, bạn có thể thực hiện Tham khảo FindAll trên ClientSize để tìm người vi phạm.)


NumericUpDownkhông đúng quy mô của nó Margin, quá. Có vẻ như lề được thu nhỏ hai lần. Nếu tôi thu nhỏ lại một lần, nó có vẻ tốt.
ygoe

AutoScaleMode = Fontkhông hoạt động tốt cho người dùng sử dụng phông chữ rất lớn và trên Ubuntu. Chúng tôi thíchAutoScaleMode = DPI
KindDragon

> TextBox với MultiLine = True và Font được kế thừa. Phát điên cả ngày - đó là cách khắc phục! Cám ơn rất nhiều! Nhân tiện, bản sửa lỗi tương tự cũng là bản sửa lỗi cho các điều khiển ListBox. : D
neminem

Đối với tôi, danh sách các hộp với phông chữ được kế thừa không có tỷ lệ tốt. Họ làm sau khi thiết lập rõ ràng. (.NET 4.7)
PulseJet

Trong chủ đề reddit này liên quan đến vấn đề mở rộng winform, tôi đã tìm thấy liên kết này với Telerik Demo Monitor DPI Mẫu từ chối trách nhiệm mà tôi chưa sử dụng. Bài viết này của Telerik là về nhân rộng các cài đặt dpi
lướt web vào

27

Kinh nghiệm của tôi khá khác biệt với câu trả lời được bình chọn hàng đầu hiện nay. Bằng cách bước qua mã khung .NET và kiểm tra mã nguồn tham chiếu, tôi đã kết luận rằng mọi thứ đã sẵn sàng để tự động mở rộng quy mô và chỉ có một vấn đề tinh tế ở đâu đó làm rối tung nó. Điều này hóa ra là đúng.

Nếu bạn tạo bố cục có thể điều chỉnh lại / có kích thước tự động, thì hầu như mọi thứ sẽ hoạt động chính xác như nó sẽ, với các cài đặt mặc định được sử dụng bởi Visual Studio (cụ thể là AutoSizeMode = Phông chữ trên biểu mẫu mẹ và Kế thừa mọi thứ khác).

Gotcha duy nhất là nếu bạn đã đặt thuộc tính Font trên biểu mẫu trong trình thiết kế. Mã được tạo sẽ sắp xếp các bài tập theo thứ tự abc, có nghĩa là AutoScaleDimensionssẽ được gán trước Font . Thật không may, điều này hoàn toàn phá vỡ logic mở rộng tự động WinForms.

Việc sửa chữa là đơn giản mặc dù. Hoặc không đặt thuộc Fonttính trong trình thiết kế (đặt nó trong hàm tạo biểu mẫu của bạn) hoặc sắp xếp lại theo cách thủ công các bài tập này (nhưng sau đó bạn phải tiếp tục thực hiện việc này mỗi khi bạn chỉnh sửa biểu mẫu trong trình thiết kế). Voila, gần như hoàn hảo và tự động mở rộng quy mô với rắc rối tối thiểu. Ngay cả các kích thước hình thức được thu nhỏ chính xác.


Tôi sẽ liệt kê các vấn đề đã biết ở đây khi tôi gặp chúng:

  • Nested TableLayoutPanel tính toán biên kiểm soát không chính xác . Không có công việc nào được biết đến xung quanh việc tránh các lề và phần đệm hoàn toàn - hoặc tránh các bảng bố trí bảng lồng nhau.

1
Không thiết lập Fonttrong trình thiết kế: Một ý nghĩ xuất hiện trong đầu: hãy tiếp tục và đặt phông chữ trong trình thiết kế, để bạn có thể thiết kế với phông chữ mong muốn. THEN trong constructor, sau khi bố trí, đọc thuộc tính phông chữ đó và đặt lại cùng một giá trị? Hoặc có thể chỉ yêu cầu bố trí để được thực hiện lại? [ Hãy cẩn thận : Tôi không có lý do để thử nghiệm phương pháp này.] Hoặc theo câu trả lời của Knowleech , trong trình thiết kế chỉ định bằng pixel (vì vậy, nhà thiết kế Visual Studio sẽ không bán lại trên màn hình DPI cao) và trong mã đọc giá trị đó, chuyển đổi từ pixel đến điểm (để có tỷ lệ chính xác).
ToolmakerSteve

1
Mỗi bit của mã của chúng tôi có kích thước tỷ lệ tự động được đặt ngay trước chế độ tỷ lệ tự động và tất cả đều có tỷ lệ hoàn hảo. Có vẻ như thứ tự không quan trọng trong hầu hết các trường hợp.
Josh

Tôi đã tìm kiếm mã của mình cho các trường hợp AutoScaleDimensionskhông được đặt thành new SizeF(6F, 13F)khuyến nghị trong câu trả lời hàng đầu. Hóa ra trong mọi trường hợp, thuộc tính Phông chữ của biểu mẫu đã được đặt (không phải mặc định). Có vẻ như khi AutoScaleMode = Font, sau đó AutoScaleDimensionsđược tính dựa trên thuộc tính phông chữ của biểu mẫu. Ngoài ra, cài đặt Thu nhỏ trong Bảng điều khiển Windows dường như có ảnh hưởng đến AutoScaleDimensions.
Walter Stabosz

24

Nhắm mục tiêu Ứng dụng của bạn cho .Net Framework 4.7 và chạy nó trong Windows 10 v1703 (Creators Update Build 15063). Với .Net 4.7 trong Windows 10 (v1703), MS đã thực hiện rất nhiều cải tiến DPI .

Bắt đầu với .NET Framework 4.7, Windows Forms bao gồm các cải tiến cho các kịch bản DPI cao và DPI động phổ biến. Bao gồm các:

  • Các cải tiến về tỷ lệ và bố cục của một số điều khiển Windows Forms, chẳng hạn như điều khiển MonthCalWiki và điều khiển CheckedListBox.

  • Chia tỷ lệ đơn. Trong .NET Framework 4.6 và các phiên bản trước đó, việc chia tỷ lệ được thực hiện qua nhiều lần, điều này khiến một số điều khiển được thu nhỏ hơn mức cần thiết.

  • Hỗ trợ cho các kịch bản DPI động trong đó người dùng thay đổi DPI hoặc hệ số tỷ lệ sau khi ứng dụng Windows Forms được khởi chạy.

Để hỗ trợ nó, hãy thêm một bảng kê khai ứng dụng vào ứng dụng của bạn và báo hiệu rằng ứng dụng của bạn hỗ trợ Windows 10:

<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
    <application>
        <!-- Windows 10 compatibility -->
        <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
    </application>
</compatibility>

Tiếp theo, thêm một app.configvà khai báo ứng dụng Per Monitor Aware. Điều này NGAY BÂY GIỜ được thực hiện trong app.config và KHÔNG trong bảng kê khai như trước đây!

<System.Windows.Forms.ApplicationConfigurationSection>
   <add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection> 

PerMonitorV2 này là mới kể từ Windows 10 Tạo Lập Cập nhật:

DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2

Còn được gọi là Per Monitor v2. Một tiến bộ so với chế độ nhận thức DPI trên mỗi màn hình gốc, cho phép các ứng dụng truy cập các hành vi mở rộng liên quan đến DPI mới trên cơ sở cửa sổ cấp cao nhất.

  • Thông báo thay đổi cửa sổ con DPI - Trong bối cảnh Per Monitor v2, toàn bộ cây cửa sổ được thông báo về mọi thay đổi DPI xảy ra.

  • Thu nhỏ khu vực không dành cho khách hàng - Tất cả các cửa sổ sẽ tự động có khu vực không dành cho khách hàng của họ được vẽ theo kiểu nhạy cảm DPI. Các cuộc gọi đến EnableNonClientDpiScaling là không cần thiết.

  • S caling của menu Win32 - menu Tất cả NTUSER tạo ra trong bối cảnh mỗi Monitor v2 sẽ được nhân rộng trong một thời trang mỗi màn hình.

  • Mở rộng hộp thoại - Các hộp thoại Win32 được tạo trong bối cảnh Per Monitor v2 sẽ tự động trả lời các thay đổi DPI.

  • Cải thiện tỷ lệ điều khiển comctl32 - Các điều khiển comctl32 khác nhau đã cải thiện hành vi chia tỷ lệ DPI trong bối cảnh Per Monitor v2.

  • Cải thiện hành vi theo chủ đề - Các tay cầm UxTheme được mở trong ngữ cảnh của cửa sổ Per Monitor v2 sẽ hoạt động theo DPI được liên kết với cửa sổ đó.

Bây giờ bạn có thể đăng ký 3 sự kiện mới để nhận thông báo về các thay đổi DPI:

  • Control.DpiChangedAfterParent , được kích hoạt Xảy ra khi cài đặt DPI cho điều khiển được thay đổi theo chương trình sau khi xảy ra sự kiện thay đổi DPI cho điều khiển hoặc biểu mẫu chính của nó.

  • Control.DpiChangedB BeforeParent , được kích hoạt khi cài đặt DPI cho điều khiển được thay đổi theo chương trình trước khi xảy ra sự kiện thay đổi DPI cho điều khiển hoặc biểu mẫu mẹ của nó.

  • Form.DpiChanged , được kích hoạt khi cài đặt DPI thay đổi trên thiết bị hiển thị nơi biểu mẫu hiện đang được hiển thị.

Bạn cũng có 3 phương thức trợ giúp về xử lý / chia tỷ lệ DPI:

  • Control.LogicalToDeviceUnits , chuyển đổi một giá trị từ logic sang pixel thiết bị.

  • Control.ScaleBitmapLogicalToDevice , chia tỷ lệ hình ảnh bitmap thành DPI logic cho thiết bị.

  • Control.DeviceDpi , trả về DPI cho thiết bị hiện tại.

Nếu bạn vẫn thấy sự cố, bạn có thể từ chối các cải tiến DPI thông qua các mục app.config .

Nếu bạn không có quyền truy cập vào mã nguồn, bạn có thể truy cập các thuộc tính ứng dụng trong Windows Explorer, đi đến tính tương thích và chọn System (Enhanced)

nhập mô tả hình ảnh ở đây

kích hoạt quy mô GDI để cải thiện xử lý DPI:

Đối với các ứng dụng Windows dựa trên GDI giờ đây có thể mở rộng quy mô DPI trên cơ sở mỗi màn hình. Điều này có nghĩa là các ứng dụng này, một cách kỳ diệu, sẽ trở thành nhận thức DPI trên màn hình.

Thực hiện tất cả các bước đó và bạn sẽ có được trải nghiệm DPI tốt hơn cho các ứng dụng WinForms. Nhưng hãy nhớ rằng, bạn cần nhắm mục tiêu ứng dụng của mình cho .net 4.7 và cần ít nhất Windows 10 Build 15063 (Cập nhật người tạo). Trong Windows 10 Update 1709 tiếp theo, chúng tôi có thể nhận được nhiều cải tiến hơn.


12

Một hướng dẫn tôi đã viết tại nơi làm việc:

WPF hoạt động trong 'các đơn vị độc lập với thiết bị', có nghĩa là tất cả các điều khiển có tỷ lệ hoàn hảo đến màn hình dpi cao. Trong WinForms, nó cần nhiều sự chăm sóc hơn.

WinForms hoạt động theo pixel. Văn bản sẽ được thu nhỏ theo hệ thống dpi nhưng nó thường sẽ bị cắt bởi một điều khiển không được tính toán. Để tránh những vấn đề như vậy, bạn phải tránh kích thước và định vị rõ ràng. Thực hiện theo các quy tắc sau:

  1. Bất cứ nơi nào bạn tìm thấy nó (nhãn, nút, bảng) đều đặt thuộc tính AutoSize thành True.
  2. Để bố trí, sử dụng FlowLayoutPanel (a la WPF StackPanel) và TableLayoutPanel (a la WPF Grid) để bố trí, thay vì Bảng điều khiển vanilla.
  3. Nếu bạn đang phát triển trên một máy có độ phân giải cao, nhà thiết kế Visual Studio có thể là một sự thất vọng. Khi bạn đặt AutoSize = True, nó sẽ thay đổi kích thước điều khiển cho màn hình của bạn. Nếu điều khiển có AutoSizeMode = GrowOnly, nó sẽ duy trì kích thước này cho những người trên dpi bình thường, tức là. lớn hơn dự kiến. Để khắc phục điều này, hãy mở trình thiết kế trên máy tính có dpi bình thường và nhấp chuột phải, đặt lại.

3
đối với các hộp thoại có thể thay đổi kích thước AutoSize trên mọi thứ sẽ là một cơn ác mộng, tôi không muốn các nút của mình ngày càng lớn hơn khi tôi tăng kích thước hộp thoại của mình theo cách thủ công trong khi chạy chương trình.
Josh

10

Tôi thấy rất khó để WinForms chơi tốt với DPI cao. Vì vậy, tôi đã viết một phương thức VB.NET để ghi đè hành vi biểu mẫu:

Public Shared Sub ScaleForm(WindowsForm As System.Windows.Forms.Form)
    Using g As System.Drawing.Graphics = WindowsForm.CreateGraphics
        Dim sngScaleFactor As Single = 1
        Dim sngFontFactor As Single = 1
        If g.DpiX > 96 Then
            sngScaleFactor = g.DpiX / 96
            'sngFontFactor = 96 / g.DpiY
        End If
        If WindowsForm.AutoScaleDimensions = WindowsForm.CurrentAutoScaleDimensions Then
            'ucWindowsFormHost.ScaleControl(WindowsForm, sngFontFactor)
            WindowsForm.Scale(sngScaleFactor)
        End If
    End Using
End Sub

6

Gần đây tôi đã gặp phải vấn đề này, đặc biệt là kết hợp với thay đổi kích thước Visual Studio khi trình chỉnh sửa được mở trên hệ thống dpi cao. Tôi thấy tốt nhất nên giữ AutoScaleMode = Font , nhưng để đặt Phông chữ Biểu mẫu thành phông chữ mặc định, nhưng chỉ định kích thước theo pixel , không phải điểm, tức là : Font = MS Sans; 11px. Trong mã, sau đó tôi đặt lại phông chữ về mặc định: Font = SystemFonts.DefaultFontvà tất cả đều ổn.

Chỉ hai xu của tôi. Tôi nghĩ rằng tôi chia sẻ, bởi vì, việc lưu giữ AutoScaleMode = Font , và cài đặt kích thước phông chữ theo pixel cho Nhà thiết kế là một thứ tôi không tìm thấy trên internet.

Tôi có thêm một số chi tiết trên Blog của mình: http://www.sgrottel.de/?p=1581&lang=en


4

Ngoài các neo không hoạt động tốt: Tôi sẽ đi một bước xa hơn và nói rằng định vị chính xác (hay còn gọi là sử dụng thuộc tính Location) không hoạt động tốt với tỷ lệ phông chữ. Tôi đã phải giải quyết vấn đề này trong hai dự án khác nhau. Trong cả hai, chúng tôi phải chuyển đổi vị trí của tất cả các điều khiển WinForms sang sử dụng TableLayoutPanel và FlowLayoutPanel. Sử dụng thuộc tính Dock (thường được đặt thành Điền) bên trong TableLayoutPanel hoạt động rất tốt và tỷ lệ tốt với phông chữ hệ thống DPI.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.