xaml - 如何根据 Metro 应用程序中的当前方向更改列表框的项目模板?

标签 xaml windows-8 microsoft-metro winrt-xaml itemtemplate

您好,我正在开发一个 Metro 应用程序,我的应用程序在横向模式下运行得非常好,但现在我想让它也兼容纵向模式。

这就是我定义学生列表框的方式:-

 <ListBox x:Name="lstbxbStudents"   Background="Transparent" Height="Auto"  ScrollViewer.VerticalScrollBarVisibility="Auto"  SelectionChanged="lstbxbStudents_SelectionChanged_1" HorizontalAlignment="Left" Width="Auto" Margin="4,50,0,122" Style="{StaticResource ListBoxStyle1}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <StackPanel Width="100"  Orientation="Horizontal">
                            <TextBlock Text="{Binding stunum}" VerticalAlignment="Center" HorizontalAlignment="Left" />
                        </StackPanel>
                        <StackPanel Width="450">
                            <TextBlock Text="{Binding studsc}"   HorizontalAlignment="Left" />
                        </StackPanel>
                        <StackPanel Orientation="Horizontal"  Width="180">
                            <StackPanel>
                                <TextBlock Width="50" Text="{Binding stu_cod}" x:Name="txtblkstucode"   HorizontalAlignment="Right" />
                            </StackPanel>
                        </StackPanel>
                        <StackPanel Width="150">
                            <TextBlock Text="{Binding stuby_prc}" VerticalAlignment="Center" TextAlignment="Right" HorizontalAlignment="Center" />
                        </StackPanel>
                        <StackPanel Width="100">
                            <TextBlock Text="{Binding stuqty, Mode=TwoWay}"  TextAlignment="Center" x:Name="txtbxbqty" Tag="{Binding stunum}"     VerticalAlignment="Center"   HorizontalAlignment="Right" />
                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

现在我的疑问是,当我将其从横向模式旋转到纵向模式时,因为列表框的项目模板中存在的文本 block 的宽度已经定义,当我将其旋转到纵向时,我无法看到所有的数据存在(它会被切断),因为与横向模式相比,纵向模式的宽度较小。

1)我可以为同一个列表框设置两个项目模板,并根据当前方向在这两个模板之间切换吗??

2)当方向更改事件被触发时,如何减少/增加运行时代码隐藏中列表框的项目模板内存在的文本 block 的宽度。??

3)视觉状态在这一点上有用吗?如果有用的话怎么办??

4)有没有其他方法可以解决这个问题,我是否缺少任何替代方案?

请帮帮我,先谢谢了。

最佳答案

您可以使用视觉状态更改ItemTemplate。首先将两个项目模板放入资源中:

<Page.Resources>
    <DataTemplate x.Key="Landscape">
         <!-- your landscape template -->
    </DataTemplate>
    <DataTemplate x.Key="Portrait">
         <!-- your portrait template -->
    </DataTemplate>
</Page.Resources>

最初将横向模板分配给ListBox:

<ListBox x:Name="listbox" ItemTemplate="{StaticResource Landscape}" />

VisualStateManager 中更改 FullScreenPortrait 视觉状态的模板:

<VisualStateManager.VisualStateGroups>
    <VisualState x:Name="FullScreenPortrait">
        <Storyboard>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="listbox" Storyboard.TargetProperty="ItemTemplate">
                <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource Portrait}"/>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </VisualState>
</VisualStateManager.VisualStateGroups>

确保您使用 LayoutAwarePage 作为页面的基类以实现此功能。

关于xaml - 如何根据 Metro 应用程序中的当前方向更改列表框的项目模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15405098/

相关文章:

wpf - 在资源中创建一个控件,然后在XAML WPF中重用它

c# - 在 Universal App (Windows) 中检测 CPU 是否为 64 位

.net - 在 Windows 8 DESKTOP 应用程序中使用 SQLite

c# - 如何将相同的 VisualState 应用于多个控件?

wpf - 如何使用 IsEnabled 来禁用 Expander 的部分而不是全部?

c# - 如何将 C# 中的图像数组绑定(bind)到 XAML 图像源?

xaml - 将新的 Windows 8.1 搜索框设置为仅使用字形

xml - Metro 应用程序 - 翻译 UI 资源 - 从外部 xml 导入内容

c++ - LNK2013错误 "fixup overflow"

c# - 将 Dictionary<string, Task<string>> 转换为 Dictionary<string, string>