Как использовать выбор пункта панорамы

Я пытаюсь определить текущий элемент панорамы, в котором находится пользователь, и затем соответствующим образом переключить свойство isenabled кнопки на панели приложения. Мне не повезло, как реализовать такую ​​функцию или правильно определить текущий элемент панорамы. В частности, я хотел бы использовать свойство selectedItem и определять имя элементов панорамы вместо свойства selectedIndex, поскольку элементы панорамы могут менять свой порядок. Есть какой-либо способ сделать это? Пока что у меня есть следующее:

MainPage.xaml

<controls:Panorama SelectionChanged="PanoramaItemSelectionChanged">         

            <!--Panorama item one-->
            <controls:PanoramaItem Header="statuses" >
                ...
            </controls:PanoramaItem>

            <!--Panorama item two-->
            <controls:PanoramaItem Header="mentions" >
                ...
            </controls:PanoramaItem>

            <!--Panorama item three-->
            <controls:PanoramaItem Header="messages" >
                ...
            </controls:PanoramaItem>

            <!--Panorama item four-->
            <controls:PanoramaItem Header="favorites" >
                ...
            </controls:PanoramaItem>

        </controls:Panorama> 

MainPage.xaml.cs

private void PanoramaItemSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        string currentPanoramaItem = e.AddedItems[0] as string;

        switch (currentPanoramaItem)
        {
            case "statuses":
                //show application bar button?
                break;
            case "mentions":
                //show application bar button?
                break;
            case "messages":
                ((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = true;
                break;
            case "favorites":
                //show application bar button?
                break;
            default:
                return;
        }            
    }

моя реализация SelectionChanged по какой-то причине не работает. Есть идеи (с примером, пожалуйста)?

6 ответов

Решение

Строковое значение PanoramaItemSelectionChanged, используемое в операторе switch, должно быть следующим:

string currentPanoramaItem = ((PanoramaItem)(((Panorama)sender).SelectedItem)).Header.ToString();

Тестирование с использованием имени заголовка - плохая идея, так как ваш код сломается, если вы переименуете заголовки панорамы или локализуете их.

Вы могли бы обработать выбранный индекс, но он сломался бы, если бы вы переупорядочили свои элементы:

        PanoramaItem selectedItem = (PanoramaItem)e.AddedItems[0];
        int selectedIndex = mainPanorama.Items.IndexOf(selectedItem);

Самый надежный способ - установить тег на элементы Панорамы и проверить это:

XAML:

   <phone:Panorama x:Name="myPanorama" SelectionChanged="Panorama_SelectionChanged_1">

        <phone:PanoramaItem Header="the places" Tag="places">
        </phone:PanoramaItem>

        <phone:PanoramaItem Header="the routes" Tag="routes">
        </phone:PanoramaItem>
    </phone:Panorama>

Код позади:

    private void Panorama_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        if (e.AddedItems.Count < 1) return;
        if (!(e.AddedItems[0] is PanoramaItem)) return;

        PanoramaItem selectedItem = (PanoramaItem)e.AddedItems[0];

        string strTag = (string)selectedItem.Tag;
        if (strTag.Equals("places"))
            // Do places stuff
        else if (strTag.Equals("routes"))
            // Do routes stuff

     }

Вы также можете просто использовать номера индексов для запуска различных действий. Поскольку панорамные страницы не предназначены для использования с большим количеством PanoramaItems. Это не может быть проблемой.

Xaml

<phone:Panorama Title="my application" SelectionChanged="Panorama_SelectionChanged">

    <phone:PanoramaItem Header="first item">
    </phone:PanoramaItem>

    <phone:PanoramaItem Header="second item">
    </phone:PanoramaItem>

    <phone:PanoramaItem Header="third item">
    </phone:PanoramaItem>

</phone:Panorama>

Я полагаю, вы работаете с ApplicationBar видимость

Code

private void Panorama_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    switch (((Panorama)sender).SelectedIndex)
    {

        case 0: // defines the first PanoramaItem
            ApplicationBar.IsVisible = true;
            break;

        case 1: // second one
            ApplicationBar.IsVisible = false;
            break;

        case 2: // third one
            ApplicationBar.IsVisible = true;
            break;
    }
}

Мое решение для WP8, но должно быть таким же для WP7.x

Сначала добавьте имя для каждого PanoramaItem и используйте его как ссылку из своего кода. В моем случае у меня есть x:Name = "piRegister" и x:Name = "piLogin"

В событии SelectionChanged вы должны восстановить свой ApplicationBar:

private void Login_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   string piName = (e.AddedItems[0] as PanoramaItem).Name;

   switch(piName)
   {
      case "piLogin":
         SetupAppBar_Signin();
         break;
      case "piRegister":
         SetupAppBar_Register();
         break;
   }
}

//use this code only if you need to setup the app bar from code
void SetupAppBar()
{
   ApplicationBar = new ApplicationBar();

   ApplicationBar.Mode = ApplicationBarMode.Default;
   ApplicationBar.Opacity = 1.0;
   ApplicationBar.IsVisible = true;
   ApplicationBar.IsMenuEnabled = true;
}


void SetupAppBar_Signin()
{   
   ApplicationBar.Buttons.Clear();

   ApplicationBarIconButton button1 = new ApplicationBarIconButton();
   button1.IconUri = new Uri("/icon.png", UriKind.Relative);
   button1.Text = "button 1";
   ApplicationBar.Buttons.Add(button1);
   button1.Click += new EventHandler(button1_Click);
}

void SetupAppBar_Register()
{   
   ApplicationBar.Buttons.Clear();

   ApplicationBarIconButton button1 = new ApplicationBarIconButton();
   button1.IconUri = new Uri("/icon.png", UriKind.Relative);
   button1.Text = "button 1";
   ApplicationBar.Buttons.Add(button1);
   button1.Click += new EventHandler(button1_Click);

   ApplicationBarIconButton button2 = new ApplicationBarIconButton();
   button2.IconUri = new Uri("/icon.png", UriKind.Relative);
   button2.Text = "button 1";
   ApplicationBar.Buttons.Add(button2);
   button2.Click += new EventHandler(button2_Click);
}

Я бы назвал панораму, а затем вы можете обратиться к ее свойству selectedIndex, чтобы определить, какой элемент панорамы выбран. Я считаю, что это будет более эффективно, чем работа со строками, которые находятся в заголовках.

    <Controls:Panorama name="x">...</Controls:Panorama>

    private void PanoramaItemSelectionChanged(object sender, SelectionChangedEventArgs e)    
 { switch (x.SelectedIndex) ... }

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

Есть альтернатива для переключения случая.... вы можете использовать

private void PanoramaItemSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (panoramacontrol.selecteditem == xyzpanorama)
    {
        //....................//
    }
}

где

  • Panoramacontrol - это имя вашей Панорамы
  • xyzpanorama - это название объекта в Панораме. например, "статусы" в вашем случае.

не следует путать с заголовком, поскольку заголовок и имя могут отличаться.

Другие вопросы по тегам