Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Разработка контрола


Автор: oldshaman 18.3.2009, 11:59
Всем здравствуйте.
В WPF новичек, потому прошу помочь советом. Если кто видел 1С (и 7.7, и 8.х), там есть такой контрол - ПолеВвода. Смысл в том, что мы в режиме проектирования (но можно и потом в рантайме) устанавливаем ему некий тип значения - например, число, строка, дата, или ссылку на имеющийся в приложении класс (Документ.РасходнаяНакладная, Справочник.Контрагенты) и тп, а он, соответственно, при нажатии на кнопку выбора, либо показывает маленький калькулятор, календарик, либо открывает форму выбора ссылочного класса с гридом. То есть в общем, в упрощенном варианте, без выбора типа значения в рантайме, TextBox+Button. 

Я сделал наследника от Control, два DependancyProperty - ValueType с типом Type (или лучше string?) и Value (object), ControlTemplate в XAML, команду ButtonSelect, которую привязал к кнопке в шаблоне, эта команда вызывает маршрутизированное событие BeginSelect, на которое клиентский код, использующий контрол, может подписываться прямо в XAML. Еще надо объявить, конечно, делегат для указания метода, как, собственно, контрол должен действовать в зависимости от установленного типа значения.  А может, прямо в нем через switch-case сделать жесткую привязку для простых типов, а для ссылочных, отображающих сущности, использовать шаблон метода, который искать в сборке по имени класса?

В принципе, по MSDN и книжке Мэтью Макдональда разобраться вполне можно, но не хотелось бы лишних граблей, поэтому вопрос: я вообще в правильном направлении двигаюсь? 

Автор: Idsa 18.3.2009, 13:59
Насколько я понимаю, Вам необходимо создать контрол, который будет умело комбинировать готовые контролы. В этом случае наследоваться удобнее от UserControl (Add -> New Item -> UserControl).

Автор: oldshaman 18.3.2009, 15:55
Нет, Idsa, не совсем так. 
Я пробовал сначала делать UserControl, но в MSDN перечислены ограничения такого подхода, одно из них - поддержка тем и настройка элемента через ControlTemplate. Да и логически это все-таки не комбинация конрролов, а другой элемент, то есть, в соответствии с абстракцией WPF об отделении логики от представления - это нечто, что умеет принимать тип класса в качестве типа значения, а потом хранить ссылку на какой-то объект этого типа. Ну и соответственно, как-то отображать значение, на которое ссылается. Кнопка и текстбокс - просто самая простая и очевидная реализация такой задачи. 
В принципе, можно, конечно, взять и положить на форму эти элементы, и на каждый из них повесить соответствующие обработчики. Но как-то это совсем грубо, хочется создать именно контрол, потому что это во-первых, законченная логическая сущность, а во-вторых, просто привык в 1С такими штуками пользоваться.
Есть, например, объект Order, у него есть поле Customer, я на форму кидаю такой контрол, говорю в XAML, что тип значения у него - class Customer, а он 1) при начале выбора (это может быть щелчок по нему, HotKey или начало ввода в TextBox, подразумевающее автозаполнение по первым символам) открывает форму (окно, список, грид, в общем коллекцию из базы) со списком этих клиентов, обрабатывая выбор в этом списке; 2) как-то понятно для пользователя отображает выбранное значение, например, с помощью Customer.ToString().

Наверное, я как-то непонятно объясняю :(

Автор: Partizan 18.3.2009, 16:16
oldshaman, на самом деле тут проще всего для типов .NET иметь какие-то предопределённые значения, а для пользовательских типов ввести атрибуты.

Автор: oldshaman 19.3.2009, 07:56
Вот, нарисовал скриншоты, может, так проще будет понять, что от этого контрола требуется.

Автор: Partizan 19.3.2009, 13:19
oldshaman, UserControl - это то, что вам нужно smile

Автор: fabio25 6.4.2009, 09:19
посмотри UZTO 'www.UZTO.NetDec.uz'
Там InputControl

Автор: oldshaman 17.4.2009, 07:10
fabio25, спасибо за ссылку! 
С контролом-то я уж давно разобрался, а вот сама эта система узбекская - офигеть! Такое ощущение, что они не просто передрали с 1С всю систему, но даже и специально старались скопировать то, что в .Net в принципе сделать можно гораздо лучше.

Автор: Idsa 17.4.2009, 07:14
Цитата(oldshaman @  17.4.2009,  11:10 Найти цитируемый пост)
а вот сама эта система узбекская - офигеть!

Про какую систему речь?
Я, кстати, сейчас (вот прямо сейчас smile ) занимаюсь созданием еще одной такой системы. Готовьтесь ;)

Автор: fabio25 17.4.2009, 19:49
Цитата(oldshaman @  17.4.2009,  07:10 Найти цитируемый пост)
то в .Net в принципе сделать можно гораздо лучш

А моможеш по подроблнее

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)