Добрый день!
Разрабатывать свой контрол который инкапсулирует экземпляр класса Canvas.
Возникла необходимость позиционировать элементы на Canvas.
Реализовал прикрепляемые свойства Top и Left в своем объекта.
Не могу разобрать как связать эти свойства с соответствующими свойствами Canvas
Рекомендую иметь свойство Position типа Point, так на одно прикрепямемое свойство меньше, одно без другого все равно не используется. Использовать в хендлере, обрабатывающем изменение вашего прикрепленного зависимого свойства — меняйте его Margin.
Здравствуйте, Аноним, Вы писали:
А>Добрый день! А>Разрабатывать свой контрол который инкапсулирует экземпляр класса Canvas. А>Возникла необходимость позиционировать элементы на Canvas. А>Реализовал прикрепляемые свойства Top и Left в своем объекта. А>Не могу разобрать как связать эти свойства с соответствующими свойствами Canvas
Если речь идет о Dependency property, то в случае с CustomControl можно связать так:
public CustomControl1()
{
Binding myBinding = new Binding("Left");
myBinding.Source = this;
InnerCanvas.SetBinding(Canvas.LeftProperty, myBinding);
}
InnerCanvas — собственно, экземпляр класса Canvas.
В MSDN можно найти подробности.
Здравствуйте, DmitryMS, Вы писали:
DMS>Рекомендую иметь свойство Position типа Point, так на одно прикрепямемое свойство меньше, одно без другого все равно не используется. Использовать в хендлере, обрабатывающем изменение вашего прикрепленного зависимого свойства — меняйте его Margin.
Плохая рекомендация. Такой тип данных почти не используется в свойствах стандартных элементов WPF, а потому привязка данных между контролами будет требовать использование конвертера в одну сторону и приводить к двойному боксингу в другую. На фига такое надо
Здравствуйте, Аноним, Вы писали:
А>Добрый день! А>Разрабатывать свой контрол который инкапсулирует экземпляр класса Canvas. А>Возникла необходимость позиционировать элементы на Canvas. А>Реализовал прикрепляемые свойства Top и Left в своем объекта. А>Не могу разобрать как связать эти свойства с соответствующими свойствами Canvas
Насколько я понял, у вас есть класс, который внутри себя использует Canvas. Вы создали в этом классе прикрепляемые свойства Top и Left. С какой целью? Как планируется их использовать?
Здравствуйте, Аноним, Вы писали:
А>Добрый день! А>Разрабатывать свой контрол который инкапсулирует экземпляр класса Canvas. А>Возникла необходимость позиционировать элементы на Canvas. А>Реализовал прикрепляемые свойства Top и Left в своем объекта. А>Не могу разобрать как связать эти свойства с соответствующими свойствами Canvas
Зачем? просто используйте в элементах уже существующие Top/Left.
Тебе ответил на это: "Рекомендую иметь свойство Position типа Point, так на одно прикрепямемое свойство меньше, одно без другого все равно не используется"... и объяснил, почему данный подход не очень то хорош. А так, меня всегда можно меня поправить
Я имел ввиду использовать одно свойство вместо двух, тип второстепенное. Потом, ты пробовал сделать так:
namespace:Behavior.Property="1,5" со свойством Property Point? Это работает. Для простой трансляции достаточно биндинга на (Canvas.Left) & (Canvas.Top) as per Sinix.
RE>>А так, меня всегда можно меня поправить
Без сомнения.
Здравствуйте, DmitryMS, Вы писали:
DMS>Я имел ввиду использовать одно свойство вместо двух, тип второстепенное. Потом, ты пробовал сделать так: DMS>namespace:Behavior.Property="1,5" со свойством Property Point? Это работает. Для простой трансляции достаточно биндинга на (Canvas.Left) & (Canvas.Top) as per Sinix.
Дык, я и не утверждал, что значение свойства с типом Point нельзя задать в XAML. Речь идет о том, что это свойство неудобно использовать в Binding-ах. Если я захочу привязать его, например, к положению двух полос прокрутки, то у них у каждой есть по свойству Value с типом double. А мне нужен Point. Приплыли — идем писать конвертер для MultiBinding... Теперь обратный вариант. Мне придется делать привязку с путем Point.X. Движок Binding-а при получении значения свойства с типом Point сделает первый боксинг, а потом, извлечет из него X, что будет вторым боксингом. Неудобно.
Здравствуйте, MxMsk, Вы писали:
MM>Дык, я и не утверждал, что значение свойства с типом Point нельзя задать в XAML. Речь идет о том, что это свойство неудобно использовать в Binding-ах. Если я захочу привязать его, например, к положению двух полос прокрутки, то у них у каждой есть по свойству Value с типом double. А мне нужен Point. Приплыли — идем писать конвертер для MultiBinding... Теперь обратный вариант. Мне придется делать привязку с путем Point.X. Движок Binding-а при получении значения свойства с типом Point сделает первый боксинг, а потом, извлечет из него X, что будет вторым боксингом. Неудобно.
Думаю, я ошибся в выделенном. Значение самого Point-а будет взято через DependencyObject.GetValue, а там никакого unboxing-а естественно не будет. Причем тоже самое должно наблюдаться и при привязке на обычные свойства. Вся нагрузка ляжет только на получение непосредственного значения (то бишь на X) и только из-за того, что X — не box.
Вся нагрузка ляжет только на получение непосредственного значения (то бишь на X) и только из-за того, что X — не box.
Вся нагрузка размажется по цепочке dependency property и PropertyDescriptr-ов (особенно если используются дефолтные, через рефлексию). Боксинг — копейки.
Здравствуйте, Sinix, Вы писали:
S>Вся нагрузка размажется по цепочке dependency property и PropertyDescriptr-ов (особенно если используются дефолтные, через рефлексию). Боксинг — копейки.
Безусловно. Меня здесь интересовал вопрос попутного boxing/unboxing.
что за чушь если вы используете свойства одного типа на обоих концах байндинга они будут совместимы по определению. Если нет — вам 100% нужен конвертер и внутри этого конвертора вам придется приводить типаы. Вообше меня всегда умиляет боксинг как главный аргумент, вы же не студент, нет?