Как получить родительский визуальный размер в XamlCompositionBrushBase?

Я создаю класс, наследуемый от XamlCompositionBrushBase и хотите узнать размер визуала, к которому прикреплена кисть, когда она подключена в OnConnected.

Мне нужна эта информация, чтобы создать в моей композиции поверхность размером с мой визуал, чтобы не только иметь правильную плотность пикселей, но и отображать координаты визуала в пространство поверхности.

т. е. если у меня есть координата 50, 75, мне нужно знать ширину/высоту визуального элемента, чтобы сопоставить местоположение поверхности с этим местоположением на визуальном элементе.

Поскольку кисть является объектом зависимости, я попытался использовать var parent = VisualTreeHelper.GetParent(this);, но это вызвало исключение:

Произошло исключение System.Exception HResult=0x8000FFFF
Сообщение=Катастрофический сбой (Исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED))
Источник=

Возможно ли это без использования прикрепленного свойства в родительском UIElement?

Спасибо


person Michael Hawker - MSFT    schedule 18.02.2018    source источник


Ответы (1)


Вы не можете - поскольку кисть может быть связана с несколькими визуальными элементами одновременно, на самом деле не существует понятия «размер». Во всяком случае, не на этом верхнем уровне XAML в UWP.

И поскольку кисти можно использовать в словарях ресурсов и, следовательно, применять как один и тот же экземпляр в нескольких местах, каждый с разными визуальными размерами, вы действительно не хотите ломать свой путь, поскольку вы почти наверняка нарушите любое использование кисти в словарь ресурсов.

(Что да, расстраивает.)

person Johnny Westlake    schedule 27.02.2018
comment
Однако внутри должно быть какое-то представление об этом, иначе Absolute MappingMode для LinearGradientBrush не будет работать. - person Michael Hawker - MSFT; 28.02.2018
comment
Внутренне уверены, но у нас нет доступа к ним. Вот как это делает WPF: referencesource. microsoft.com/PresentationCore/Core/CSharp/ (метод GetTileBrushMapping) Откуда он вызывается, я не могу сказать. UWP не совсем то же самое, но это та же идея - и, к сожалению, все это внутреннее :/ - person Johnny Westlake; 28.02.2018