Главная » Разработка для Windows Phone 7 » TextBlock в коде

0

Прежде чем мы перейдем к экспериментам с XAML, я должен сделать еще одно важное предупреждение: осваивая XAML, не забудьте C#!

Вспомним XAML-версию TextBlock в Grid из главы 2:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Text="Hello, Windows Phone 7!"

HorizontalAlignment="Center" VerticalAlignment="Center" />

</Grid>

Фактически, элементы в XAML (такие как TextBlock) – это классы. Атрибуты этих элементов (такие как Text, HorizontalAlignment и VerticalAlignment) – свойства класса. Давайте рассмотрим, насколько просто с помощью кода создать TextBlock и вставить TextBlock в Grid, описанный в XAML,.

В проекте TapForTextBlock (Касание для блока текста) реализована такая функциональность, что при каждом касании экрана в коде создается новый TextBlock. Файл MainPage.xaml включает TextBlock, центрированный по сетке для содержимого:

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

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

Text="Hello, Windows Phone 7!" HorizontalAlignment="Center"

VerticalAlignment="Center" />

</Grid>

При каждом касании экрана в файле выделенного кода для MainPage создается дополнительный TextBlock. При этом для задания свойства Margin нового элемента TextBlock, чтобы разместить его случайным образом в сетке для содержимого, используются размеры существующего TextBlock:

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

public partial class MainPage : PhoneApplicationPage {

Random rand = new Random();

public MainPage() {

InitializeComponent();

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

TextBlock newTextBlock = new TextBlock(); newTextBlock.Text = "Hello, Windows Phone 7!"; newTextBlock.HorizontalAlignment = HorizontalAlignment.Left; newTextBlock.VerticalAlignment = VerticalAlignment.Top; newTextBlock.Margin = new Thickness(

(ContentPanel.ActualWidth – txtblk.ActualWidth) * rand.NextDouble(), (ContentPanel.ActualHeight – txtblk.ActualHeight) * rand.NextDouble(), 0, 0);

ContentPanel.Children.Add(newTextBlock);

args.Complete();

args.Handled = true;

base.OnManipulationStarted(args);

}

}

Нет необходимости строго придерживаться приведенной последовательности действий. Можно сначала добавить TextBlock в ContentPanel и только потом задавать свойства TextBlock.

Но это тот род вещей, которые просто невозможно реализовать в XAML. XAML не может отвечать на события, не может произвольным образом создавать новые экземпляры элементов, не может обращаться к классу Random (Случайный) и, безусловно, не может проводить вычисления.

Можно воспользоваться синтаксическим расширением, появившимся в C# 3.0, которое позволяет одновременно создать экземпляр класса и определить его свойства:

TextBlock newTextBlock = new TextBlock {

Text = "Hello, Windows Phone 7!", HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(

(ContentPanel.ActualWidth – txtblk.ActualWidth) * rand.NextDouble(), (ContentPanel.ActualHeight – txtblk.ActualHeight) * rand.NextDouble(), 0, 0)

};

ContentPanel.Children.Add(newTextBlock);

Это делает код немного более похожим на XAML (за исключением вычислений и вызовов метода rand.NextDouble), но все равно можно заметить, что XAML обеспечивает более краткую запись. В коде в качестве значений свойств HorizontalAlignment и VerticalAlignment должны быть заданы члены перечислений HorizontalAlignment и VerticalAlignment, соответственно. В XAML требуется задать лишь имя члена.

Из XAML нельзя явно увидеть, что у Grid есть свойство Children (Потомки), что это свойство является коллекцией, и то что размещение TextBlock в Grid фактически добавляет TextBlock в коллекцию Children. В коде процесс добавления TextBlock в Grid должен быть более явным.

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

По теме:

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