我希望将字母表中的每个字母都作为单个Windows Phone PanoramaItem。请在此时接受。每个字母都以多种方式显示(斜体,常规,粗体,其他字体......)。当然我可以手动完成,但它不灵活。所以我决定写一个简单的Letter类,它基本上包含两个字符 - 一个字母的大写和小写。我们的想法是将这些信件的集合绑定到Panorama(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编程时,它不是以性能为导向,但让我们暂时保留这种方式。
Panorama在电话页面的构造函数中填充了一个简单的循环,从字符代码'A'迭代到'Z',创建相应的字母并将其添加到字母集合中。它工作得很好,但有点慢:我不得不等待~3秒才显示,这是不可接受的。
我对此问题的第一个解决方案是将字母表集合限制为5个字母,并在选择更改时编辑其中的4个字母。我尝试了几种方法,但基本上我的问题是在修改发生时更新PanoramaItems。
从集合中删除并添加Letters:不会破坏漂亮的过渡。 当包含的Letter的属性发生变化时,使集合触发CollectionChanged:尝试它,与之前一样。 BindingExpression的UpdateTarget():该方法似乎在.NET CE中不可用。
也许我忽视了某些事情,或者只是遵循了完全不合适的方法。你会怎么做?
提前致谢!
答案 0 :(得分:2)
请记住,26个PanoramaItem可能会降低性能。
查看Best Practices section here中的第一个要点,它说:
通过将所用部分的数量限制为最多四个部分,确保全景应用程序顺利执行。如果您的内容密集,或者您的许多部分共享多个托管控件,那么您应该使用更少的部分。
答案 1 :(得分:0)
为了完整起见:我现在第一次离开它(26 PanoramaItems),只是删除了我的DataTemplate中的StackPanels并将ObservableCollection更改为List。根据{{3}},我应该获得一个小的性能提升。没关系。
仍然......如果你知道我在Windows Phone上更新单个PanoramaItem(绑定目标)的特定问题的解决方案,请告诉我。
亲切的问候。
答案 2 :(得分:0)
如果使用以下类结构:
class LetterContainer
{
public Letter Letter { get; set; }
}
class Letter
{
public String UpperCase { get; set; }
public String LowerCase { get; set; }
}
而不是创建类Letter
的列表,而是创建一个类型LetterContainer
的列表以与Parorama
控件绑定。当然,您需要更改已创建的Template
中的绑定。现在,您所做的就是更改Letter
个对象中LetterContainer
属性的值。这样,不会触发CollectionChanged
个事件。但是,请确保为PropertyChanged
,Letter
和UpperCase
属性举办LowerCase
个活动。
答案 3 :(得分:0)
感谢您的回复!
@decyclone:奇怪的是,我没有看到你的......无论如何,也许我会试一试。我只是想知道我对该系列的解决方案有多么不同。我在Letter中实现了NotifyPropertyChanged并解雇了它,但是PanoramaItem没有自动更新。为什么现在应该这样做?
@MartinHN:我知道在谈到性能时,这不是最好的解决方案。这就是我在第一篇文章中所说的以及我在这里问过的原因:)