Проблема неверного отображения содержимого Dockable Panel при масштабе экрана

Автор Тема: Проблема неверного отображения содержимого Dockable Panel при масштабе экрана  (Прочитано 1280 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Возможно редко кто, но все-же сталкивались с проблемой - если в настройках экрана выставить масштаб, отличный от 100%, то содержимое Dockable Panel будет отображаться неверно. Обычно оно как-бы уезжает за границы панели.
Проблема уже пофиксена в 2019 Ревите, но для версий ниже актуальна.
Так вот решение этой проблемы не сложное. Сложнее было его найти. Все решение сводится к обратному масштабированию содержимого панели. А чтобы это сделать просто и удобно я сделал вот такой декоратор:
Код - C# [Выбрать]
  1. namespace Revit_FixDockablePanelOnScreenScale
  2. {
  3.     using System.Windows;
  4.     using System.Windows.Controls;
  5.     using System.Windows.Media;
  6.  
  7.     public class ScreenScaleDecorator : Decorator
  8.     {
  9.         public ScreenScaleDecorator()
  10.         {
  11.             Loaded += OnLoaded;
  12.         }
  13.  
  14.         private void OnLoaded(object sender, RoutedEventArgs e)
  15.         {
  16.             var presentationSource = PresentationSource.FromVisual(this);
  17.             if (presentationSource != null)
  18.             {
  19.                 if (presentationSource.CompositionTarget != null)
  20.                 {
  21.                     Matrix m = presentationSource.CompositionTarget.TransformFromDevice;
  22.                     ScaleTransform dpiTransform = new ScaleTransform(m.M11, m.M22);
  23.                     if (dpiTransform.CanFreeze)
  24.                         dpiTransform.Freeze();
  25.                     RenderTransform = dpiTransform;
  26.  
  27.                     // Масштабируем текст обратно
  28.                     if (Parent is Page page)
  29.                         page.FontSize *= 1 / m.M11;
  30.                 }
  31.  
  32.                 // Обязательно нужно отписаться, иначе декоратор будет срабатывать повторно,
  33.                 // когда будут закрыты все документы и открыт новый. Содержимое панели
  34.                 // будет масштабироваться в геометрической прогрессии
  35.                 Loaded -= OnLoaded;
  36.             }
  37.  
  38.         }
  39.     }
  40. }
Достаточно просто обернуть в него содержимое панели.
Как вы могли догадаться, речь о содержимом, написанным на xaml.

Более подробно с ссылкой на тестовый проект я описал решение в блоге

Надеюсь, окажется полезным