我希望将字母表中的每个字母都作为一个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编程时,它并不是很注重性能,但让我们暂时把它放在一边。
Panorama在phone页面的构造函数中填充了一个简单的循环,从字符代码'A‘迭代到'Z',创建适当的字母并将其添加到字母表集合中。它工作得很好,但有点慢:我必须等待大约3秒才能显示出来,这是不可接受的。
我对这个问题的第一个解决方案是将字母表集合限制为5个字母,并在选择发生变化时编辑其中的4个。我尝试了几种方法,但基本上我的问题是在修改发生时更新PanoramaItems。
从集合中删除和添加Letters :销毁漂亮的转换,不可能。当包含的字母的属性发生变化时,让集合触发CollectionChanged :尝试一下,和以前一样。BindingExpression的UpdateTarget():该方法似乎在.NET CE中不可用。
也许我忽略了什么,或者只是遵循了完全不合适的方法。你会怎么做?
提前感谢!
发布于 2010-11-25 20:32:06
为了完整起见:现在我把它留在了第一种方式(26 PanoramaItems),只是在我的DataTemplate中删除了StackPanels,并将ObservableCollection改为一个列表。因此,根据this tips & tricks entry的说法,我应该获得一个小的性能提升。没关系的。
不过..。如果你知道我在Windows Phone上更新单个PanoramaItem (绑定的目标)的具体问题的解决方案,请告诉我。
致以亲切的问候。
发布于 2010-11-25 21:33:16
请记住,26 PanoramaItems可能会降低性能。
看一下Best Practices section here中的第一个项目符号,它说:
通过将使用的区段数量限制为最多四个区段来确保全景应用程序顺利执行。如果您的内容很密集,或者如果您的许多节共享多个托管控件,则应使用更少的节。
发布于 2010-11-25 20:49:23
如果使用以下类结构:
class LetterContainer
{
public Letter Letter { get; set; }
}
class Letter
{
public String UpperCase { get; set; }
public String LowerCase { get; set; }
}创建一个LetterContainer类型的列表来绑定Parorama控件,而不是创建一个类Letter的列表。当然,您需要更改已创建的Template中的绑定。现在,您所要做的就是更改LetterContainer对象中Letter属性的值。这样,就不会触发任何CollectionChanged事件。但是,一定要为Letter、UpperCase和LowerCase属性引发PropertyChanged事件。
https://stackoverflow.com/questions/4244701
复制相似问题