| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 - это то, что вам нужно |
| Автор: 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 |
Про какую систему речь? Я, кстати, сейчас (вот прямо сейчас |
| Автор: fabio25 17.4.2009, 19:49 |
А моможеш по подроблнее |