Вопрос по xaml, windows-phone-7, c# – как использовать выбор пункта панорамы

0

Я пытаюсь определить текущий элемент панорамы, в котором находится пользователь, и затем соответствующим образом переключить свойство 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 по какой-то причине не работает. Есть идеи (с примером, пожалуйста)?

Вы должны разыграть SelectedItem в PanoramaItem до этого:((PanoramaItem)(((Panorama)sender).SelectedItem)).Header MarcinJuraszek
Попробуйте строку currentPanormaItem = ((Панорама) отправитель) .SelelctedItem.Header; BigL
да, теперь я вижу, что SelectedItem является объектом, попробуйте привести его к PanoramaItem, и тогда он должен работать BigL
@ BigL к сожалению, это тоже не сработало. Заголовок не является опцией SelectedItem. Matthew

Ваш Ответ

6   ответов
1

Вы также можете просто использовать номера индексов для запуска различных действий. Так как панорамные страницы не предназначены для использования с большим количеством 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;
    }
}
0

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

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

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

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

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

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

0

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

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

где

  • panoramacontrol is name of your Panorama
  • xyzpanorama is name of item in Panorama. for eg "statuses" in your case.

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

0

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

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

В событии 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);
}
1

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

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

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

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

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

     }

Похожие вопросы