|
Программирование >> Программирование с использованием ajax
В частности, код в Card предоставляет клиентскому коду доступ к двум таким свойствам зависимостей, как Suit и Rank, и привязывает эти свойства к визуальным элементам в компоновке элемента управления. В результате этого при установке Suit в Club по центру карты отображается слово Club, а в двух из ее углов - соответствующее значение Rank. Реализация свойств Suit и Rank рассматривается позже. Пока достаточно знать только то, что эти свойства принимают значения, соответственно, типа string и типа int. Можно было использовать для них, например, и перечисление, но тогда потребовалось бы добавлять немного больше нового кода, поэтому чтобы не усложнять пример, для них были выбраны эти базовые значения. Для привязки значения к свойству применяется синтаксис привязки, представляющий собой расширение разметки. Этот синтаксис подразумевает указание значения свойства в формате {Binding . . . }. Для настройки привязки предусмотрено несколько различных способов. В данном примере привязка для элемента управления SuitLabel конфигурируется следующим образом: <Label x:Name= SuitLabel Content= {Binding Path=Suit, ElementName=UserControl, Mode=Default} ContentTemplate= {DynamicResource SuitTemplate} HorizontalAlignment= Center VerticalAlignment= Center Margin= 8,51,8,60 /> Здесь для настройки привязки задаются три свойства: Path (представляющее имя свойства), ElementName (указывающее на элемент, к которому относится данное свойство) и Mode (указывающее, в каком режиме должна выполняться привязка). Свойства Path и ElementName довольно просты, а на свойство Mode можно пока не обращать внимания. Главное заключается в том, что такая спецификация приводит к привязке свойства Label. Content к свойству Card. Suit. При привязке значений свойств нужно еще обязательно указывать, как должно визуализироваться привязанное содержимое, применяя шаблон данных. В данном примере используется шаблон данных по имени SuitTemplate, причем как динамический ресурс (хотя в данном случае его привязка к статическому ресурсу тоже бы прекрасно подошла). Его определение содержится в разделе ресурсов элемента управления и выглядит следующим образом: <UserControl.Resources> <DataTemplate х:Кеу= SuitTemplate > <TextBlock Text= {Binding} /> </DataTemplate> </UserControl.Resources> Строковое значение свойства Suit используется в качестве значения для свойства Text элемента управления TextBlock. Для двух надписей свойства Rank применяется это же самое определение DataTemplate, причем то, что в Rank содержится значение типа int, роли не играет, поскольку при привязке к свойству TextBlock.Text оно все равно преобразуется в значение string. О привязке данных и шаблонах данных можно было бы рассказать еще очень многое, но в этой книге просто не хватит места, чтобы описать все детали. В заключительной части главы будут перечислены источники, в которых можно найти дополнительную информацию. Напоследок хотелось бы обратить внимание на то, что средство Expression Blend позволяет очень эффективно привязывать данные и при этом особо не беспокоиться о синтаксисе XAML. Чтобы такая привязка данных работала, нам пришлось определить два свойства зависимостей с помощью приемов, описанных в предыдущем разделе. Их определения содержатся в файле отделенного кода пользовательского элемента управления и вы- глядят следующим образом (у обоих из них имеются простые оболочки свойств .NET, показывать которые здесь из-за их простоты не имеет никакого смысла): public static DependencyProperty SuitProperty = DependencyProperty.Register( Suit , typeof(string), typeof(Card), new PropertyMetadata( Club , new PropertyChangedCallback(OnSuitChanged)), new ValidateValueCallback(ValidateSuit) ) ; public static DependencyProperty RankProperty = DependencyProperty.Register( Rank , typeof(int), typeof(Card), new PropertyMetadata(1) , new ValidateValueCallback(ValidateRank) ) ; Оба свойства зависимостей предусматривают использование метода обратного вызова для верификации значений, а свойство Suit также использует метод обратного вызова при изменении своего значения. Эти предназначенные для верификации методы обратного вызова имеют возвращаемый тип bool и один параметр типа object, представляющий значение, которое клиентский код пытается установить для свойства. Если с этим значением все в порядке, тогда методы должны возвращать true, а если нет, тогда - false. В данном примере, значение свойства Suit ограничивается одной из четырех строк: public static bool ValidateSuit(object suitValue) string suitValueString = (string)suitValue; if (suitValueString != Club && suitValueString != Diamond && suitValueString != Heart && suitValueString != Spade ) return false; return true; Показанный код довольно груб и, конечно, перечисление подошло бы здесь гораздо больше, однако оно не применялось по указанным ранее причинам. Свойство Rank тоже ограничивается значением в диапазоне от 1 (туз) до 12 (король): public static bool ValidateRank(object rankValue) { int rankValueInt = (mt) rankValue; if (rankValueInt < 1 I I rankValueInt > 12) return false; return true; При изменении значения Suit вызывается метод обратного вызова OnSuitChanged (). Этот метод отвечает за установку цвета текста в красный (для червей и бубен) или в черный (для пик и треф). Делает он это за счет вызова вспомогательного метода в источнике его вызова. Вызывать вспомогательный метод ему необходимо из-за того, что он реализован как статический метод, а ему в качестве параметра передается эк- земпляр пользовательского элемента управления, который сгенерировал событие, чтобы он мог с ним взаимодействовать. Называется этот вспомогательный метод SetTextColor(). public static void OnSuitChanged(DependencyObject source, DependencyPropertyChangedEventArgs args) ((Card)source).SetTextColor(); Метод SetTextColor () является приватным, но, как очевидно, он все равно доступен из метода OnSuitChanged(), поскольку они оба являются членами одного и того же класса, несмотря на то, что при этом представляют собой, соответственно, метод экземпляра и статический метод. SetTextColorO просто устанавливает свойство Foreground различных надписей элемента управления в сплошную цветную кисть, в которой используется либо черный, либо красный цвет, в зависимости от значения Suit: private void SetTextColorO { if (Suit == Club I I Suit == Spade ) { RankLabel.Foreground = new SolidColorBrush(Color.FromRgb(0, 0, 0)); SuitLabel.Foreground = new SolidColorBrush(Color.FromRgb(0, 0, 0)); RankLabellnverted.Foreground = new SolidColorBrush(Color.FromRgb(0, 0, 0)); else { RankLabel.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0)); SuitLabel.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0)); RankLabellnverted.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0)) ; Вот и все, на что требуется обратить внимание в коде элемента управления Card. Клиентский код, содержащийся в Windowi. xaml и Windowi. xaml. cs, выглядит довольно просто. В нем применяются кое-какие базовые приемы стилизации для обеспечения фона с градиентной зеленой заливкой, а также ряд операций обработки событий (в которых участвуют как просто маршрутизируемые, так и подключаемые маршрутизируемые события) для обеспечения возможности взаимодействия с пользователем. Есть еще несколько трюков, вроде применения полей для расположения карт и сдвига для обеспечения возможности перетаскивания существующих карт из точки, в которой выполняется щелчок, но разобраться в том, как они работают, вполне можно самостоятельно, внимательно изучив код. Резюме В этой главе было рассказано обо всем, что необходимо знать для того, чтобы начать программировать с помощью WPF. Здесь также, хотя и кратко, были рассмотрены некоторые более сложные приемы, что позволит хотя бы немного заглянуть в мир возможностей, которые открывают более развитые методики программирования в WPF. Данная тема является слишком обширной для того, чтобы ее можно было осветить в одной главе, и потому те, кого она заинтересовала, наверняка захотят заглянуть в дополнительные посвященные ей источники. Рекомендуем обратиться к полноценному источнику сведений о WPF и применении XAML в Web-среде - книге WPF: Windows Presentation Foundation в .NET 3.0 для профессионалов (ИД Вмьямс , 2007 г.).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |