0

ユーザーが現在表示している現在のパノラマアイテムを検出し、それに応じてアプリケーションバーのアイコンボタンの有効化プロパティを切り替えようとしています。このような機能を実装する方法や、現在のパノラマアイテムを適切に検出する方法がわかりませんでした。具体的には、selectedIndexプロパティの代わりに、selectedItemプロパティを使用して、パノラマアイテムの名前を検出したいと思います。これは、パノラマアイテムの順序が変更される可能性があるためです。これを行う方法はありますか?これまでのところ、私が持っているのは次のとおりです。

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実装は、何らかの理由で機能しません。何かアイデアはありますか(例を挙げてください)?

4

6 に答える 6

1

パノラマ アイテム ヘッダーの名前を変更したり、ローカライズしたりすると、コードが破損するため、ヘッダー名を使用してテストすることはお勧めできません。

選択したインデックスを作成することはできますが、アイテムを並べ替えると壊れてしまいます。

        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

     }
于 2012-12-03T22:20:25.143 に答える
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;
    }
}
于 2013-01-15T22:50:28.343 に答える
0

私が行う方法は、パノラマに名前を付けることです。その後、その selectedIndex プロパティを参照して、どのパノラマ項目が選択されているかを判断できます。ヘッダーにある文字列を処理するよりも効率的だと思います。

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

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

また、パノラマでアプリケーション バーを使用することはベスト プラクティスではありません。実際には使用しないことをお勧めしますが、使用するかどうかはユーザー次第です。

于 2012-06-05T13:00:05.157 に答える
0

switch ステートメントで使用される panoramaItemSelectionChanged 文字列値は、次のようにする必要があります。

string currentPanoramaItem = ((PanoramaItem)(((Panorama)sender).SelectedItem)).Header.ToString();
于 2012-06-05T16:44:21.040 に答える
0

私の解決策は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);
}
于 2013-04-04T16:25:14.740 に答える
0

スイッチケースの代わりがあります....使用できます

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

どこ

  • panoramacontrol はパノラマの名前です
  • xyzpanorama は Panorama のアイテムの名前です。たとえば、あなたの場合は「ステータス」です。

ヘッダーと名前は異なる場合があるため、ヘッダーと混同しないでください。

于 2013-04-01T10:02:13.547 に答える