Главная » Разработка для Windows Phone 7 » Кнопки и стили Windows Phone 7

0

Свойство Style описано классом FrameworkElement, поэтому, несомненно, оно наследуется классами Control, ButtonBase и Button. Рассмотрим приложение, описывающее Style для Button в разделе Resources страницы:

Project: ButtonStyles Файл: MainPage.xaml (фрагмент)

<phone:PhoneApplicationPage.Resources>

<Style x:Key="btnStyle" TargetType="Button">

<Setter Property="Foreground" Value="SkyBlue" /> <Setter Property="FontSize" Value="36" /> <Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="Margin" Value="12" /> </Style>

</phone:PhoneApplicationPage.Resources>

Как обычно, у свойства Style есть атрибут x:Key и свойство TargetType. Три элемента управления Button размещены в StackPanel. Каждый имеет ссылку на ресурс Style:

Проект: ButtonStyles Файл: MainPage.xaml (фрагмент)

<Grid x:Name=" ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel>

<Button Content="Button No. 1"

Style="{StaticResource btnStyle}" />

<Button Content="Button No. 2"

Style="{StaticResource btnStyle}" />

<Button Content="Button No. 3"

Style="{StaticResource btnStyle}" /> </StackPanel> </Grid>

Так это выглядит на экране:

Теперь заменим один из этих трех объектов Button объектом ToggleButton:

<ToggleButton Content="Button No. 2"

Style="{StaticResource btnStyle}" />

Это приводит к ошибке времени выполнения, потому что выполняется попытка настройки ToggleButton из ресурса Style, в качестве TargetType которого задан объект Button.

Но если взглянуть на иерархию классов, можно увидеть, что оба класса, Button и ToggleButton, наследуются от ButtonBase. Зададим его в качестве TargetType для Style:

<Style x:Key="btnStyle" TargetType="ButtonBase">

<Setter Property="Foreground" Value="SkyBlue" /> <Setter Property="FontSize" Value="36" /> <Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="Margin" Value="12" /> </Style>

Теперь все нормально. Можно даже менять TargetType на Control, но это максимальная вольность, которую можно себе позволить в данном конкретном примере. Если изменить TargetType на FrameworkElement, опять получим ошибку времени выполнения, потому что у FrameworkElement нет свойств Foreground или FontSize.

Следует взять за правило задавать в качестве TargetType самый общий класс, у которого имеются все свойства, определенные в Style. Можно наследовать свойства на основании производных классов. Например, можно начать со Style, TargetType которого является ButtonBase, и затем создать два производных стиля с TargetType типа Button и TargetType типа ToggleButton.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии