Всем привет. Возможно редко кто, но все-же сталкивались с проблемой - если в настройках экрана выставить масштаб, отличный от 100%, то содержимое Dockable Panel будет отображаться неверно. Обычно оно как-бы уезжает за границы панели.
Проблема уже пофиксена в 2019 Ревите, но для версий ниже актуальна.
Так вот решение этой проблемы не сложное. Сложнее было его найти. Все решение сводится к обратному масштабированию содержимого панели. А чтобы это сделать просто и удобно я сделал вот такой декоратор:
namespace Revit_FixDockablePanelOnScreenScale
{
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
public class ScreenScaleDecorator : Decorator
{
public ScreenScaleDecorator()
{
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
var presentationSource = PresentationSource.FromVisual(this);
if (presentationSource != null)
{
if (presentationSource.CompositionTarget != null)
{
Matrix m = presentationSource.CompositionTarget.TransformFromDevice;
ScaleTransform dpiTransform = new ScaleTransform(m.M11, m.M22);
if (dpiTransform.CanFreeze)
dpiTransform.Freeze();
RenderTransform = dpiTransform;
// Масштабируем текст обратно
if (Parent is Page page)
page.FontSize *= 1 / m.M11;
}
// Обязательно нужно отписаться, иначе декоратор будет срабатывать повторно,
// когда будут закрыты все документы и открыт новый. Содержимое панели
// будет масштабироваться в геометрической прогрессии
Loaded -= OnLoaded;
}
}
}
}
Достаточно просто обернуть в него содержимое панели.
Как вы могли догадаться, речь о содержимом, написанным на xaml.
Более подробно с ссылкой на тестовый проект я описал
решение в блогеНадеюсь, окажется полезным