根据页面方向更改DataTemplate

时间:2011-08-16 06:40:57

标签: windows-phone-7 orientation datatemplate

我在XAML中有两个listBox ItemTemplate。但我无法使用Page的orientationChanged事件更改它以更改DataTemplate。 这是代码:

protected override void OnOrientationChanged(OrientationChangedEventArgs e)
    {
        if (e.Orientation == PageOrientation.Landscape ||
            e.Orientation == PageOrientation.LandscapeLeft ||
            e.Orientation == PageOrientation.LandscapeRight)
        {
            this.HeadLineListBox.ItemTemplate = (DataTemplate)this.Resources["L_headerTemplate"];
        }

        else if (e.Orientation == PageOrientation.Portrait ||
                 e.Orientation == PageOrientation.PortraitDown ||
                 e.Orientation == PageOrientation.PortraitUp)
        {
            this.HeadLineListBox.ItemTemplate = (DataTemplate)this.Resources["P_headerTemplate"];
        }

        base.OnOrientationChanged(e);
    }

当我第一次进入页面时,如果Orientation是Portrait,它将始终显示Portrait DataTemplate,即使我更改了Orientation。所以,当我第一次进入页面时,它是Landscape.Someone可以帮助我吗?

PS:我使用的方式发布在这里:http://wp7-developer.com/code-snippet/changing-the-datatemplate-based-on-page-orientation/但它仍然不起作用。

2 个答案:

答案 0 :(得分:1)

您需要在分配新的itemtemplate后再次绑定itemsource以将更新的itemtemplate应用为 -

 if (e.Orientation.ToString().Contains("Portrait"))

   lstData.ItemTemplate =

     (DataTemplate)this.Resources["listPortrait"];

 else

   lstData.ItemTemplate =

     (DataTemplate)this.Resources["listLandscape"];

 lstData.ItemsSource = null;

 lstData.ItemsSource = ((Products)this.Resources["productCollection"]).DataCollection;

答案 1 :(得分:0)

不幸的是,我不认为这会起作用。将项目添加到ListBox时应用ItemTemplate。您可以使用以下代码段和您自己的单独模板对此进行测试:

// Constructor
public MainPage()
{
    InitializeComponent();
    Loaded += (sender, e) =>
    {
        DispatcherTimer t = new DispatcherTimer();
        t.Interval = TimeSpan.FromSeconds(5);
        t.Tick += (sender2, e2) =>
        {
            MyListBox.Items.Add(this.Orientation.ToString());
        };
        t.Start();
    };
}

效果很有趣。在我的示例中,当我旋转模拟器时,以下输出被写入列表框:

THIS IS THE PORTRAIT TEMPLATE: PortraitUp
THIS IS THE LANDSCAPE TEMPLATE: LandscapeLeft 
THIS IS THE LANDSCAPE TEMPLATE: LandscapeRight 
THIS IS THE LANDSCAPE TEMPLATE: LandscapeLeft 
THIS IS THE PORTRAIT TEMPLATE: PortraitUp

过去对我有用的另一种方法是使用两个完全不同的布局管理器 - 一个针对纵向布局进行了优化,另一个针对横向进行了优化 - 并根据方向的变化切换每个布局的可见性/不透明度。我过去使用过这种技术,它提供了很好的Blendability和不错的性能(如果你的页面不是太复杂)。我仍然在努力寻找“最佳”方法,但至少我知道这个方法有效。

/克里斯