Программирование >>  Программирование с использованием ajax 

1 ... 368 369 370 [ 371 ] 372 373 374 ... 396


Здесь методы GetValue () и SetValue (), соответственно, получают и устанавливают значение свойства зависимости MyStringProperty для текущего экземпляра. Эти два метода являются общедоступными, так что клиентский код может использовать их напрямую для манипулирования значениями свойств зависимостей. Именно поэтому добавление соответствующего .NET-свойства для обеспечения возможности получения прямого доступа к свойству зависимости не является обязательным.

Если требуется указать для свойства метаданные, тогда нужно использовать объект, унаследованный от PropertyMetadata, например, FrameworkPropertyMetadata, и передавать его в виде четвертого параметра методу Register {). У конструктора FrameworkPropertyMetadata имеется И перегрузок и каждая из них принимает один или более из параметров, перечисленных в табл. 34.5.

Таблица 34.5. Параметры, которые принимает конструктор FrameworkPropertyMetadata

Тип параметра

Описание

object defaultValue

FrameworkPropertyMetadataOptions flags

PropertyChangedCallback propertyChangedCallback

CoerceValueCallback coerceValueCallback

bool isAnimationProhibited

UpdateSourceTrigger defaultUpdateSourceTrigger

Значение, которое должно использоваться для свойства по умолчанию

Комбинация флагов (из перечисления Framework PropertyMetadataOptions), которые можно использовать для указания дополнительных метаданных для свойства. Например, флаг Af fectsArrange служит для объявления о том, что внесение изменений в свойство может отражаться на компоновке элемента управления. Это будет вынуждать отвечающий за компоновку механизм окна заново просчитывать компоновку элемента управления в случае изменения свойства. Полный перечень доступных для этого параметра опций можно найти в документации MSDN

Метод обратного вызова, который должен использоваться при изменении значения свойства

Метод обратного вызова, который должен использоваться при приведении значения свойства

Указывает, может ли данное свойство изменяться в результате применения анимационного эффекта

Когда значения свойств привязываются к данным, это свойство определяет то, когда должно происходить обновление источника данных, в соответствии со значениями из перечисления UpdateSourceTrigger. По умолчанию для него устанавливается значение PropertyChanged, указывающее, что обновление источника привязки должно происходить сразу же при изменении свойства. Такое поведение подходит не для всех случаев; например, свойство TextBox.Text требует, чтобы для этого свойства использовалось значение LostFocus. Оно в его случае гарантирует, что обновление источника привязки не будет происходить преждевременно. Еще для этого свойства можно использовать значение Eplicit, которое указывает, что обновление источника привязки должно осуществляться только по требованию (т.е. при вызове метода UpdateSource () класса, унаследованного от DependancyObj ect)



В качестве простого примера FrameworkPropertyMetadata можно применить просто для указания значения, которое должно использоваться для свойства по умолчанию:

public class MyClass : DependencyObject {

public static DependencyProperty MyStringProperty = DependencyProperty. Register( MyString ,

typeof(string),

typeof(MyClass),

new FrameworkPropertyMetadata( Default value ) значение no умолчанию

Ранее уже было рассказано о трех методах обратного вызова, которые можно применять для уведомления об изменении значения свойства, для приведения значения свойства и для верификации значения свойства. Эти методы, подобно самому свойству зависимости, должны обязательно реализоваться в виде общедоступных, статических методов. У каждого из них имеется конкретный возвращаемый тип и список параметров, которые нужно использовать.

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

Пользовательские элементы управления

1. Создайте новое WPF-пpL7IOжeниe по имени Ch34Ex05 и сохраните его в каталоге C:\BegVCSharp\Chapter34.

2. Добавьте в это приложение новый пользовательский элемент управления Card и измените код в представляющем его файле Card.xaml следующим образом:

<UserControl

xmlns= http: schemas.microsoft.cbm/winfx/2006/xaml/presentation xmlns :x= http: / /schemas .microsof t. com/wmf x/2 00 6/xaml x:Class= Ch34Ex05.Card

Height= 150 Width= 100 x:Name= UserControl FontSize= 16 FontWeight= Bold > <UserControl.Resources>

<DataTemplate x:Key= SuitTemplate > <TextBlock Text= {Binding} />

</DataTemplate> </UserControl.Resources> <Grid>

<Rectangle Stroke= {xiNull} RadiusX= 12.5 RadiusY= 12.5 > <Rectangle.Fill>

<LinearGradientBrush EndPoint= 0.47,-0.167 StartPoint= 0.86, 0.92 > <GradientStop Color= #FFDlC78F Offset= 0 /> <GradientStop Color= #FFFFFFFF Offset= l /> </LinearGradientBrush> </Rectangle.Fill> <Rectangle.BitmapEffect> <DropShadowBitmapEffeet /> </Rectangle.BitmapEffect> </Rectangle>



<Label x:Name= SuitLabel

Content= {Binding Path=Suit, ElementName=UserControl, Mode=Default} ContentTemplate= {DynamicResource SuitTemplate} HonzontalAlignment= Center

VerticalAlignment= Center Margin= 8,51,8,60 /> <Label x:Name= RankLabel

Content= {Binding Path=Rank, ElementName=UserControl, Mode=Default} ContentTemplate= {DynamicResource SuitTemplate} HorizontalAlignment= Left

VerticalAlignment= Top Margin= 8,8,0,0 /> <Label x:Name= RankLabelInverted

Content= {Binding Path=Rank, ElementName=UserControl, Mode=Default} ContentTemplate= {DynamicResource SuitTemplate} HonzontalAlignment= Right VerticalAlignment= Bottom Margin= 0, 0, 8, 8 RenderTransformOrigin= 0.5, 0.5 > <Label.RenderTransform> <RotateTransform Angle= 180 /> </Label.RenderTransform> </Label>

<Path Fill= #FFFFFFFF Stretch= Fill Stroke= {x:Null} Margin= 0,0,35.218,-0.077 Data= Fl MHO.5,51 L123.16457,51 C116.5986, 76.731148 115.63518,132.69684 121.63533,149.34013 133.45299, 182.12018 152.15821,195.69803 161.79765,200.07669 LllO.5,200 C103.59644, 200 98,194.40356 98,187.5 L98,63.5 098,56.596439 103.59644,51 110.5,51 z > <Path.OpacityMask>

<LinearGradientBrush EndPoint= 0.957, 1.127 StartPoint= 0,-0.06 > <GradientStop Color= #FF000000 Offset= 0 /> <GradientStop Color= #OOFFFFFF Offset= l /> </LinearGradientBrush> </Path.OpacityMask> </Path> </Grid> </UserControl>

3. Измените код в Card. xaml. cs, как показано ниже:

public partial class Card : UserControl

public static string[] Suits = { Club , Diamond , Heart , Spade }; 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)

public CardO {

InitializeComponent ();



1 ... 368 369 370 [ 371 ] 372 373 374 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика