Я бы хотел, чтобы каждая буква алфавита была единым элементом Windows Phone PanoramaItem. Пожалуйста, просто примите это в данный момент. Каждая буква отображается несколькими способами (курсив, обычный, жирный, другие шрифты ...). Конечно, я мог бы сделать это вручную, но это негибко. Поэтому я решил написать простой класс Letter, который в основном содержит два символа - прописные и строчные буквы. Идея заключалась в том, чтобы связать коллекцию этих писем с панорамой (myPano.ItemsSource = collection;). Вот шаблон:
<DataTemplate
x:Name="LetterTemplate">
<controls:PanoramaItem
Background="Black"
HorizontalAlignment="Stretch"
Name="{Binding Path=UpperCase}"
ManipulationCompleted="A_ManipulationCompleted"
>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"/>
<RowDefinition Height="0.5*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<StackPanel
Grid.Row="0"
Grid.Column="0"
Orientation="Vertical"
HorizontalAlignment="Stretch">
<TextBlock
Text="{Binding Path=UpperCase}"
Foreground="{StaticResource PhoneAccentBrush}"
HorizontalAlignment="Center"
FontFamily="Segoe WP"
FontSize="100" />
<TextBlock
Text="{Binding Path=UpperCase}"
HorizontalAlignment="Center"
Foreground="White"
FontFamily="Courier New"
FontSize="100" />
</StackPanel>
<StackPanel
Grid.Row="0"
Grid.Column="1"
Orientation="Vertical"
HorizontalAlignment="Stretch">
<TextBlock
Text="{Binding Path=UpperCase}"
Foreground="White"
HorizontalAlignment="Center"
FontFamily="Segoe WP"
FontStyle="Italic"
FontSize="100" />
<TextBlock
Text="{Binding Path=UpperCase}"
HorizontalAlignment="Center"
Foreground="{StaticResource PhoneAccentBrush}"
FontStyle="Italic"
FontFamily="Courier New"
FontSize="100" />
</StackPanel>
<StackPanel
Grid.Row="1"
Grid.Column="0"
Orientation="Vertical"
HorizontalAlignment="Stretch">
<TextBlock
Text="{Binding Path=LowerCase}"
Foreground="{StaticResource PhoneAccentBrush}"
HorizontalAlignment="Center"
FontFamily="Segoe WP"
FontStyle="Italic"
FontSize="100" />
<TextBlock
Text="{Binding Path=LowerCase}"
HorizontalAlignment="Center"
Foreground="White"
FontStyle="Italic"
FontFamily="Courier New"
FontSize="100" />
</StackPanel>
<StackPanel
Grid.Row="1"
Grid.Column="1"
Orientation="Vertical"
HorizontalAlignment="Stretch">
<TextBlock
Text="{Binding Path=LowerCase}"
Foreground="White"
HorizontalAlignment="Center"
FontFamily="Segoe WP"
FontStyle="Italic"
FontSize="100" />
<TextBlock
Text="{Binding Path=LowerCase}"
HorizontalAlignment="Center"
Foreground="{StaticResource PhoneAccentBrush}"
FontStyle="Italic"
FontFamily="Courier New"
FontSize="100" />
</StackPanel>
</Grid>
</controls:PanoramaItem>
Я знаю, что он не очень ориентирован на производительность при программировании для Windows Phone, но давайте пока оставим это так.
Панорама была заполнена простым циклом в конструкторе телефонной страницы, перебирая символьный код от «A» до «Z», создавая соответствующую букву и добавляя ее в коллекцию алфавитов. Это работало хорошо, но было довольно медленно: мне пришлось ждать около 3 секунд, пока оно не отобразилось, что недопустимо.
Мое первое решение этой проблемы состояло в том, чтобы ограничить коллекцию алфавитов 5 буквами и отредактировать 4 из них при изменении выбора. Я пробовал несколько подходов, но в основном моя проблема заключается в обновлении PanoramaItems, когда произошла модификация.
Удалить и добавить Письма из коллекции: Уничтожить красивые переходы, никак.
Заставить коллекцию запускать CollectionChanged при изменении свойства содержащейся буквы: пробовал так же, как и раньше.
UpdateTarget () BindingExpression: метод, по-видимому, недоступен в .NET CE.
Может быть, я что-то упустил или просто использовал совершенно неподходящие подходы. Как бы вы это сделали?
Заранее спасибо!