Изменение шаблона данных на основе ориентации страницы - PullRequest
0 голосов
/ 16 августа 2011

У меня есть два ListBox ItemTemplate в XAML. Но я не могу изменить его с помощью события positionChanged страницы, чтобы изменить 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);
    }

Когда я первый раз на странице, если Ориентация - Портрет, он будет показывать Шаблон данных Портрета все время, даже когда я изменил Ориентацию.Так что делать, когда я впервые захожу на страницу, это Пейзаж. Кто-то может мне помочь?

PS : Я использовал способ сообщения здесь: http://wp7 -developer.com / code-snippet / change-the-datatemplate-based-on-page-directional / Но это все равно не работает.

Ответы [ 2 ]

1 голос
/ 23 мая 2012

Вам необходимо снова связать источник элементов после назначения новой таблицы элементов, чтобы применить обновленный шаблон элементов как -

 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;
0 голосов
/ 17 августа 2011

К сожалению, я не думаю, что это сработает.ItemTemplate применяется, когда элемент добавляется в ListBox.Вы можете проверить это с помощью следующего фрагмента и собственных шаблонов:

// 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

Альтернативный подход, который работал для меня в прошлом, - это использование двух совершенно разных менеджеров компоновки - один оптимизированныйдля книжного макета, другой оптимизирован для ландшафта - и переключает видимость / непрозрачность каждого на основе изменений в ориентации.Я использовал эту технику в прошлом, и она обеспечивает хорошую смешиваемость и приличную производительность (если ваша страница не слишком сложна).Я все еще борюсь за «лучший» подход, но, по крайней мере, я знаю, что он работает.

/ chris

...