Пользовательские проблемы с отображением TabControl
Я уже несколько дней пишу пользовательский элемент управления для рисования вкладок, и по большей части все красиво и прекрасно работает... за исключением случаев, когда я использую его на своем компьютере с Windows 10 (во время выполнения).
Я вернулся к нескольким базовым строкам кода, чтобы отследить ошибку, и я не могу до конца понять это.
Ниже приведен единственный используемый код, в двух словах, я разрабатываю горизонтальный элемент управления с вкладками.
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1.UI
{
class TabControlTest : TabControl
{
public TabControlTest()
{
Alignment = TabAlignment.Left;
SizeMode = TabSizeMode.Fixed;
}
}
}
Я просто добавил пользовательский элемент управления вкладки в форму, добавил несколько групповых блоков для справочных целей и изменил цвет фона формы на серый, чтобы вы могли четко видеть элемент управления вкладки.
Теперь во время разработки 2 групповых блока (1 в элементе управления вкладками, 1 в форме) выровнены идеально.
Но во время выполнения я вижу совсем другой результат.
Как видите, часть вкладки элемента управления теперь больше, чем была во время разработки, и результирующее изменение означает, что контексты вкладки также изменились.
Если я делаю это на компьютере под управлением Windows 7, все отображается так, как оно выглядит во время разработки, как и должно!
Я добавил ImageSize, но это не имеет значения.
ItemSize = new System.Drawing.Size(30, 150);
Я переустановил VS на моей машине разработки (Win10). Я затрудняюсь объяснить, почему и как решить эту проблему.
Любая / вся помощь будет очень цениться.
1 ответ
Глядя на ширину вкладки в ваших сравнительных изображениях, я считаю, что это еще одна проблема, вызванная автоматическим масштабированием управления Windows. Я обнаружил, что параметр dpiAware автоматически устанавливается при запуске из Visual Studio, а затем возвращается к стандартному масштабированию Windows, которое Windows реализует вне Visual Studio.
Чтобы вообще предотвратить автоматическое масштабирование при запуске вне Visual Studio, необходимо уведомить ОС, что ваше приложение является dpiAware, вызвав метод Win32 P/Invoke SetProcessDPIAware() из вашего Main() до вызова Application.Run(). Как показано в примере ниже. Это позволит вашим элементам управления использовать исходное разрешение, из которого вы проектируете координаты.
static class Program
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
static void Main(string[] args)
{
if (Environment.OSVersion.Version.Major >= 6)
SetProcessDPIAware();
Application.Run(new UIMonitor());
}
}
В качестве альтернативы, если вы хотите сохранить масштабирование, вы можете установить местоположение GroupBox на основе ширины элемента управления вкладками вместо определенного местоположения. (Или с использованием некоторой комбинации контрольных измерений вместо точного размещения иглы.)