|
Программирование >> Windows foundation
<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>
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |