locked
Pivotから、動的にPivotItemを削除(or非表示に)したい RRS feed

  • 質問

  • バインドするデータが存在しない場合、動的にPivotItemを非表示にしたいと考えています。

      <!--LayoutRoot is the root grid where all page content is placed-->
      <Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{Binding Source={StaticResource SampleDataSource2}}">
        <!--Pivot Control-->
        <controls:Pivot x:Name="detailPivot">
          <controls:Pivot.Title>
            <StackPanel>
              <TextBlock Text="イベントタイトル" x:Name="eventTitleTextBlock" FontSize="50" VerticalAlignment="Center">
    	    			<TextBlock.Foreground>
    							<SolidColorBrush Color="{StaticResource PhoneAccentColor}"/>
    						</TextBlock.Foreground>
              </TextBlock>
            </StackPanel>
          </controls:Pivot.Title>
          <!--Pivot item one-->
          <controls:PivotItem Height="500" VerticalAlignment="Top">
            <controls:PivotItem.Header>
              <StackPanel>
                <TextBlock Text="詳細情報" FontSize="70" />
              </StackPanel>
            </controls:PivotItem.Header>
            <StackPanel HorizontalAlignment="Left" Height="500" Margin="0" VerticalAlignment="Top" Width="468">
              <ListBox x:Name="detailListBox" Height="500" ItemTemplate="{StaticResource ItemTemplate3}" ItemsSource="{Binding Collection}" Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="400"/>
            </StackPanel>
          </controls:PivotItem>
    
          <!--Pivot item two-->
          <controls:PivotItem DataContext="{Binding Source={StaticResource SampleDataSource3}}" Height="500" VerticalAlignment="Top" HorizontalAlignment="Left">
            <controls:PivotItem.Header>
              <StackPanel>
                <TextBlock Text="参加者" FontSize="70" />
              </StackPanel>
            </controls:PivotItem.Header>
            <StackPanel HorizontalAlignment="Left" Height="500" Margin="0" VerticalAlignment="Top" Width="468">
              <ListBox x:Name="memberListBox" HorizontalAlignment="Left" ItemTemplate="{StaticResource ItemTemplate1}" ItemsSource="{Binding Collection}" Margin="0" VerticalAlignment="Top" Height="500" Width="400"/>
            </StackPanel>
          </controls:PivotItem>
          <controls:PivotItem x:Name="hashPivotItem" DataContext="{Binding Source={StaticResource SampleDataSource4}}" Height="500" VerticalAlignment="Top" HorizontalAlignment="Left">
            <controls:PivotItem.Header>
              <StackPanel>
                <TextBlock x:Name="hashPivotHeader" Text="hashtag" FontSize="70" />
              </StackPanel>
            </controls:PivotItem.Header>
    				<StackPanel HorizontalAlignment="Left" Height="500" Margin="0" VerticalAlignment="Top" Width="468">
              <ListBox x:Name="hashtagListBox" HorizontalAlignment="Left" ItemTemplate="{StaticResource ItemTemplate4}" ItemsSource="{Binding Collection}" Margin="0" VerticalAlignment="Top" Height="500" Width="400"/>
            </StackPanel>
          </controls:PivotItem>
        </controls:Pivot>
        <Image x:Name="LoadingImage" HorizontalAlignment="Left" Height="570" VerticalAlignment="Bottom" Width="480" Source="loading.jpg" RenderTransformOrigin="0.5,0.5" d:IsHidden="True">
      		<Image.RenderTransform>
      			<CompositeTransform/>
      		</Image.RenderTransform>
      	</Image>
      </Grid>
    

    上のようなPivot定義をしています。
    値の存在有無で、名前が「hashPivotItem」のPivotItemを削除するか非表示にしたいと思い、次のようなコードを試しました。

    一つ目と、

    detailPivot.Items.RemoveAt(2);
    

    二つ目と、

    detailPivot.Items.Remove(hashPivotItem);
    

    それぞれを試行しましたが動作しませんでした。
    双方とも、「The parameter is incorrect.」のエラーが表示されました。

    しかし、まだ画面定義がシンプルな段階で動作確認をしたときには、二つ目で上手く動いたような気がしているのですが、今現在はエラーがでるようになりました。

    PivotItemを非表示もしくは削除する方法、もしくは解決策についてわかる方がいらっしゃいましたら、教えていただけないでしょうか。

    • 移動 Mike Wang (MSCS) 2012年10月2日 11:20 (移動元:Windows Phone 7 向けの開発)
    2011年8月14日 14:16

回答

  • もしかしたらバグかもしれませんが、Header を個別に定義されていることが原因となっているようです。

    正確には、PivotItemを削除後に残ったPivotItemでどれか1つでもHeaderを個別定義しているものがあると、エラーとなります。

     

    ■ 解決方法:Header 定義を簡略化

    Pivot Item のプロパティでヘッダーを定義します。

    <controls:PivotItem Height="500" VerticalAlignment="Top" Header="詳細情報">
           :
    </controls:PivotItem>

    <controls:PivotItem Height="500" VerticalAlignment="Top" HorizontalAlignment="Left"  Header="参加者">
           :
    </controls:PivotItem>

    <controls:PivotItem x:Name="hashPivotItem" Height="500" VerticalAlignment="Top" HorizontalAlignment="Left" Header="hashtag">
           :
    </controls:PivotItem>

    ただし、この方法の場合はヘッダーのフォント設定やレイアウトを個別に定義することができません。

     

    ※ しいて言えば、削除するPivotItemのヘッダーのみ個別定義が可能です。

    <controls:PivotItem x:Name="hashPivotItem" Height="500" VerticalAlignment="Top" HorizontalAlignment="Left">
        <controls:PivotItem.Header>
            <StackPanel>
                <TextBlock Name="hashPivotHeader" Text="hashtag" FontSize="70" />
            </StackPanel>
        </controls:PivotItem.Header>
    </controls:PivotItem> 

     

     


    マイクロソフト エバンジェリスト 高橋 忍
    • 回答としてマーク ayatakaMVP 2011年8月14日 17:26
    2011年8月14日 15:41

すべての返信

  • もしかしたらバグかもしれませんが、Header を個別に定義されていることが原因となっているようです。

    正確には、PivotItemを削除後に残ったPivotItemでどれか1つでもHeaderを個別定義しているものがあると、エラーとなります。

     

    ■ 解決方法:Header 定義を簡略化

    Pivot Item のプロパティでヘッダーを定義します。

    <controls:PivotItem Height="500" VerticalAlignment="Top" Header="詳細情報">
           :
    </controls:PivotItem>

    <controls:PivotItem Height="500" VerticalAlignment="Top" HorizontalAlignment="Left"  Header="参加者">
           :
    </controls:PivotItem>

    <controls:PivotItem x:Name="hashPivotItem" Height="500" VerticalAlignment="Top" HorizontalAlignment="Left" Header="hashtag">
           :
    </controls:PivotItem>

    ただし、この方法の場合はヘッダーのフォント設定やレイアウトを個別に定義することができません。

     

    ※ しいて言えば、削除するPivotItemのヘッダーのみ個別定義が可能です。

    <controls:PivotItem x:Name="hashPivotItem" Height="500" VerticalAlignment="Top" HorizontalAlignment="Left">
        <controls:PivotItem.Header>
            <StackPanel>
                <TextBlock Name="hashPivotHeader" Text="hashtag" FontSize="70" />
            </StackPanel>
        </controls:PivotItem.Header>
    </controls:PivotItem> 

     

     


    マイクロソフト エバンジェリスト 高橋 忍
    • 回答としてマーク ayatakaMVP 2011年8月14日 17:26
    2011年8月14日 15:41
  • ありがとうございます!

    教えていただいた通り、PivotItemのHeaderで個別定義を使用しないように修正したところ、正常にPivotItemを削除することができました。

    アプリケーション開発当初は、Headerを独自定義したかったのですが、開発を進める内に個別定義の必要性が無くなっていたので、
    個別定義をしないことで対応することにしました。

    PivotItemのHeaderを個別定義したい
    PivotItemを動的に削除したい
    2つの要件を同時に実現できるよう、次期バージョンで改善されるとうれしいですね!

    Connectなどから要望を出したほうが良いのでしょうか。

    2011年8月14日 17:30