Добавить элементы в панораму через код - PullRequest
0 голосов
/ 19 декабря 2010

У меня проблемы с добавлением элементов панорамы через код.

Вот тестовый xaml, который работает.

<controls:Panorama x:Name="pano">
    <controls:Panorama.Title>...</controls:Panorama.Title>
    <controls:Panorama.Background>...</controls:Panorama.Background>
    <local:TestPanoramaItem ...></local:HoroscopePanoramaItem>
    <local:TestPanoramaItem ...></local:HoroscopePanoramaItem>
    <local:TestPanoramaItem ...></local:HoroscopePanoramaItem>
</controls:Panorama>

TestPanoramaItem - это класс, который наследует от PanoramaItem, и в xaml все работает нормально.Теперь я хочу изменить порядок элементов панорамы с помощью кода.

РЕДАКТИРОВАТЬ: Теперь я удалил элементы из xaml

Я сделал порядок по умолчанию в статической строке, такой как "pan1, pan2, pan3, ... "и на OnNavigatedToHandler (в MainPage) я использую такой код:

protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            String[] order = App.Order.Split(',');
            App.items.Clear();
            foreach (String o in order)
            {
                switch (o)
                {
                    case "pan1": App.items.Add(App.pan1); break;
                    case "pan2": App.items.Add(App.pan2); break;
                    case "pan3": App.items.Add(App.pan3); break;
                    ...
                }
            }
            pano.Items.Clear();

            foreach (TestPanoramaItem ti in App.items)
                pano.Items.Add(ti);
            base.OnNavigatedTo(e);
        }

При первом вызове (это в MainPage) все выглядит нормально.Панорама работает.Там у меня есть кнопка меню, которая переходит к настройкам, где я могу изменить порядок элементов.В обработчике OnNavigateFrom на странице настроек я обновляю статическую строку App.Order.После этого снова вызывается OnNavigatedTo главной страницы, и все идет хорошо (без исключений), но я не могу переместить панораму, и в панораме элементы разбиты.

Любая помощь или решения?

1 Ответ

3 голосов
/ 20 декабря 2010

Проблема заключается в том, что вы не можете поделиться с нами кодом.
Попробуйте создать наименьший возможный полный пример, который демонстрирует проблему.

В коде вашего вопроса также есть некоторая путаница между TestPanoramaItem и HoroscopePanoramaItem.

Я могу динамически переставлять стандартные PanoramaItems без проблем.
Следующее основано на шаблоне Панорамы по умолчанию:

Mainpage.xaml:

<Grid x:Name="LayoutRoot" Background="Transparent">
    <controls:Panorama Name="myPano" Title="my application">
        <controls:Panorama.Background>
            <ImageBrush ImageSource="PanoramaBackground.png"/>
        </controls:Panorama.Background>
    </controls:Panorama>
</Grid>

<!--Panorama-based applications should not show an ApplicationBar but this is just for testing-->
<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
        <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1" Click="ApplicationBarIconButton_Click"/>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

MainPage.xaml.cs

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        myPano.Items.Clear();

        if (new Random().Next(1, 2) == 1)
        {
            myPano.Items.Add(App.pan1);
            myPano.Items.Add(App.pan2);
            myPano.Items.Add(App.pan3);
        }
        else
        {
            myPano.Items.Add(App.pan1);
            myPano.Items.Add(App.pan3);
            myPano.Items.Add(App.pan2);
        }

        base.OnNavigatedTo(e);
    }

    private void ApplicationBarIconButton_Click(object sender, EventArgs e)
    {
        NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));
    }

App.xaml.cs:

public static PanoramaItem pan1
{
    get { return new PanoramaItem { Header = "first item" }; }
}
public static PanoramaItem pan2
{
    get { return new PanoramaItem { Header = "second item" }; }
}
public static PanoramaItem pan3
{
    get { return new PanoramaItem { Header = "third item" }; }
}
...