Программирование >>  Windows foundation 

1 ... 6 7 8 [ 9 ] 10 11 12 ... 15


<Label Grid.Column= 0 Grid.ColumnSpan= 2 Grid.Row= 0

VerticalAlignment= Center HorizontalAlignment= Center >Title</Label> <Label Grid.Column= 0 Grid.Row = 1 VerticalAlignment= Center >

Firstname:</Label> <TextBox Grid.Column= 1 Grid.Row= 1 Width= 100 Height= 30 ></TextBox>

<Label Grid.Column= 0 Grid.Row = 2 VerticalAlignment= Center >

Lastname:</Label>

<TextBox Grid.Column= 1 Grid.Row= 2 Width= 100 Height= 30 ></TextBox> </Grid> </Window>

В итоге получим упорядоченные в сетку элементы управления, как показано на рис. 34.17. Для того чтобы были видны столбцы и строки, свойство ShowGridLines установлено в true.

Для Grid с одинаковыми ячейками вы можете использовать класс UniformGrid.

Обработка событий

Классы WPF определяют события, для которых вы можете добавить собственные обработчики, например, MouseEnter, MouseLeave, MouseMove, Click и тому подобные. Все это базируется на механизме событий и делегатов .NET. Описание архитектуры событий и делегатов вы найдете в главе 7.

В WPF вы можете присвоить обработчик событий либо в XAML, либо в отделенном коде. Для button1 назначен XML-атрибут Click, используемый для присваивания метода OnButtonClick событию щелчка на кнопке. Для button2 никакого обработчика событий в XAML не назначено.

<Button Name= button1 Click= OnButtonClick >Button 1</Button> <Button Name= button2 Button 2</Button>

Событие Click для button2 присваивается в отделенном коде посредством создания экземпляра делегата RoutedEventHandler и передачи метода OnButtonClick делегату. Метод OnButtonClick(), вызываемый из обеих кнопок, имеет аргументы, определенные делегатом RoutedEventHandler.

public Window1()


Рис. 34.17. Дочерние элементы управления панели Grid

InitializeComponent();

button2.Click += new RoutedEventHandler(OnButtonClick)

void OnButtonClick(object sender, RoutedEventArgs e)

MessageBox.Show( Click Event );

Механизм обработки событий для WPF базируется на событиях .NET, но расширенный средствами пузырькового распространения и туннелирования. Как вы уже знаете, Button может содержать графику, окна списков, другую кнопку и т.д. Что случится, если внутри Button будет элемент CheckBox, и вы щелкните на этом CheckBox? Где возникнет событие? Ответ заключается в том, что событие распространяется подобно пузырьку. Сначала событие Click возникает в CheckBox, а затем распространяется к Button. Таким образом, вы можете обработать событие Click во всех элементах, находящихся внутри Button, наряду с самим Button.



Некоторые события являются туннелируемыми, другие пузырьковыми. Пузырьковые события начинаются с внутреннего элемента и распространяются к внешним. Обычно туннелируемые и пузырьковые события идут парами. Туннелируемые события снабжены префиксом Preview, например, PreviewMouseMove. Это событие распространяется от внешнего элемента управления к внутренним. После события PreviewMouseMove возникает событие MouseMove. Это событие распространяется, как пузырек - от внутренних элементов управления к внешним.

Вы можете остановить туннелирование или пузырьковое распространение, задав свойству Handled аргумента события значение true. Свойство Handled - член класса RoutedEventArgs, и все обработчики событий, участвующие в процессе туннелирова-ния или пузырькового распространения, имеют аргумент типа RoutedEventArgs или наследника RoutedEventArgs.

Если вы останавливаете туннелирование события, установив свойство Handled в true, то пузырьковое событие, следующее за туннельным, уже не возникает.

Стили, шаблоны и ресурсы

Вы можете определить вид и поведение элементов WPF, устанавливая такие свойства, как FontSize и BackGround для элемента Button, как показано ниже:

<StackPanel>

<Button Name= button1 Width= 150 FontSize= 12 Background= AliceBlue >

Click Me! </Button> </StackPanel>

Но вместо определения вида каждого элемента в отдельности можно определить стили, сохраняемые в ресурсах. Для полной настройки внешнего вида элементов управления вы можете использовать также шаблоны и сохранять их в ресурсах.

Стили

Для определения стилей вы можете использовать элемент Style, содержащий в себе элементы Setter. Посредством Setter вы специфицируете значение стиля, например, свойство Button.Background и значение AliceBlue.

Чтобы присвоить стили определенным элементам, вы можете назначить стиль всем элементам типа или использовать ключ для стиля. Чтобы назначить стиль всем элементам типа, используйте свойство TargetType класса Style и присвойте его Button, специфицируя расширение разметки x:Type следующим образом:

<Window.Resources>

<Style TargetType= {x:Type Button} >

<Setter Property= Button.Background Value= LemonChiffon /> <Setter Property= Button.FontSize Value= 18 />

</Style>

<Style x:Key= ButtonStyle >

<Setter Property= Button.Background Value= AliceBlue />

<Setter Property= Button.FontSize Value= 18 />

</Style>

</Window.Resources>

В приведенном ниже XAML-коде элемент button2, не имеющий стиля, определенного в свойствах элемента, получает стиль, определенный для всего типа Button. Для button3 свойство Style устанавливается с расширением разметки StaticResource



в {StaticResource ButtonStyle}, где ButtonStyle специфицирует значение ключа ресурса стиля, определенного ранее, поэтому button3 имеет фон цвета aliceblue. <Button Name= button2 Width= 150 >Click Me!</Button>

<Button Name= button3 Width= 150 Style= {StaticResource ButtonStyle} >

Click Me, Too! </Button>

Вместо установки Background кнопки в единственное значение, вы можете сделать нечто большее - установить свойство Background в LinearGradientBrush, с определением градиентного цвета, как показано ниже:

<Style x:Key= FancyButtonStyle > <Setter Property= Button.FontSize Value= 22 /> <Setter Property= Button.Foreground Value= White /> <Setter Property= Button.Background > <Setter.Value>

<LinearGradientBrush StartPoint= 0.5,0 EndPoint= 0.5,1 > <GradientStop Offset= 0.0 Color= LightCyan /> <GradientStop Offset= 0.14 Color= Cyan /> <GradientStop Offset= 0.7 Color= DarkCyan /> </LinearGradientBrush> </Setter.Value> </Setter> </Style>

button4 получает приятный стиль, окрашиваясь в градиентный переход цвета

cyan:

<Button Name= button4 Width= 200 Style= {StaticResource FancyButtonStyle} >

Fancy! </Button>

То, что получится в результате, представлено на

рис. 34.18. Ресурсы

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

Следующий пример определяет LinearGradient Brush с ключом по имени MyGradientBrush внутри ресурсов StackPanel. Элемент button1 получает свойство Background посредством расширения разметки StaticResource в ресурс MyGradientBrush. На рис. 34.19 показан результат, который даст следующий код XAML:


Рис. 34.18. Пример использования стилей


Рис. 34.19. Пример использования ресурса

<Window x:Class= ResourcesSample.Window1

xmlns= http: schemas.microsoft.com/winfx/20 06/xaml/presentation xmlns:x= http: schemas.microsoft.com/winfx/200 6/xaml Title= Resources Sample Height= 100 Width= 300

>

<Window.Resources> </Window.Resources>



1 ... 6 7 8 [ 9 ] 10 11 12 ... 15

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