0

PivotItem の現在の実装は、欠陥があるとまでは言わないまでも、多少矛盾していると思います。完全にレンダリングされる前または後にプロパティ Header が設定されている場合、ヘッダーのサイズは適切に設定されますが、Header を null または string.empty に戻しても、ヘッダーが再度縮小されることはありません。ヘッダーが DataBinding を介して設定されているときに PivotItem ヘッダーを非表示および表示するエレガントな方法はありますか?

今のところ、イベントとプログラムによるピボットの完全な再作成を含むかなり粗雑なコードで問題を「解決」してから、すべての PivotItems を再度アタッチしようとしています。ページだけの解決策かもしれませんが、これを10回以上実行する必要がある場合は、確かにやや不安定です。

[この質問は以前に似たような文脈で尋ねられたことがありますが、実際には解決されませんでした。]

4

4 に答える 4

1

他のヘッダーを保持したまま、1つのアイテムのヘッダーのみを削除しようとしていますか?もしそうなら、私はこれをお勧めしません。それは非常に混乱するでしょう。

それらすべてを折りたたむ場合は、Pivo​​tHeaderTemplateの可視性をいくつかのものにバインドできます。1つはページのDataContextです

<controls:Pivot x:Name="MyPivot" >
    <controls:Pivot.HeaderTemplate>
        <DataTemplate>
            <Grid Visibility="{Binding DataContext.HeaderVisibility, ElementName=MyPivot}">
            <TextBlock Text="{Binding}" FontSize="{StaticResource PhoneFontSizeExtraExtraLarge}" />
            </Grid>
        </DataTemplate>
    </controls:Pivot.HeaderTemplate>

次に、ページのビューモデルにHeaderVisibilityプロパティを設定できます。

テキストをヘッダーのnullに設定する場合は、値コンバーターを使用できます

xaml:

<controls:Pivot x:Name="MyPivot" >
    <controls:Pivot.HeaderTemplate>
        <DataTemplate>
            <Grid Visibility="{Binding Converter={StaticResource TextToVisibilityConverter}}">
            <TextBlock Text="{Binding}" FontSize="{StaticResource PhoneFontSizeExtraExtraLarge}"/>
            </Grid>
        </DataTemplate>
    </controls:Pivot.HeaderTemplate>

そしてコンバーター:

public class TextToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return Visibility.Collapsed;

        return (string.InNullOrEmpty(value.ToString()) ? Visibility.Collapsed : Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2012-05-27T21:10:17.957 に答える
0

いい案!私はあなたのソリューションを正確には使用しませんが、あなたのアイデアに触発されました。

これが私がしたことです:

1. StackPanel をコンテナーとして作成し、上余白を次のように負の値に設定します。Margin="0,-35,0,0"

2.いくつかの TextBlocks を追加して Pviot ヘッダーを偽装し、ヘッダーとバインドする予定だったデータ バインディングを設定します。

3. TextBlocksWidth = "Auto"を設定し、右マージンをいくつか追加して、混雑しすぎないようにします

注: 最初の TextBlock が現在の PivotItem を表している場合、他のものは非アクティブ化されている他のものを表します。

4.アクティブ化されていない PivotItems の TextBlocks については、アクティブ化されたForeground="#FF727272"ものと区別するように を設定します。Tap="GoToPivot2_Tap"また、単純なコード ビハインドなどを使用して、イベント ハンドラーも追加します。PivotRoot.SelectedItem = Pivot2;

<controls:Pivot x:Name="PivotRoot">

    <controls:PivotItem x:Name="Pivot1">
        <StackPanel Margin="0,-35,0,0" Orientation="Horizontal">
            <TextBlock Text="{Binding Header1}" Width="Auto" Margin="0,0,25,0" FontSize="30"/>
            <TextBlock Text="{Binding Header2}" Tap="GoToPivot2_Tap" Width="Auto" Margin="0,0,25,0" Foreground="#FF727272" FontSize="30"/>
            <TextBlock Text="{Binding Header3}" Tap="GoToPivot3_Tap" Width="Auto" Margin="0,0,25,0" Foreground="#FF727272" FontSize="30"/>
        </StackPanel>
    </controls:PivotItem>

    <controls:PivotItem x:Name="Pivot2">
        <StackPanel Margin="0,-35,0,0" Orientation="Horizontal">
            <TextBlock Text="{Binding Header2}" Width="Auto" Margin="0,0,25,0" FontSize="30"/>
            <TextBlock Text="{Binding Header3}" Tap="GoToPivot3_Tap" Width="Auto" Margin="0,0,25,0" Foreground="#FF727272" FontSize="30"/>
            <TextBlock Text="{Binding Header1}" Tap="GoToPivot1_Tap" Width="Auto" Margin="0,0,25,0" Foreground="#FF727272" FontSize="30"/>
        </StackPanel>
    </controls:PivotItem>

    <controls:PivotItem x:Name="Pivot3">
        <StackPanel Margin="0,-35,0,0" Orientation="Horizontal">
            <TextBlock Text="{Binding Header3}" Width="Auto" Margin="0,0,25,0" FontSize="30"/>
            <TextBlock Text="{Binding Header1}" Tap="GoToPivot1_Tap" Width="Auto" Margin="0,0,25,0" Foreground="#FF727272" FontSize="30"/>
            <TextBlock Text="{Binding Header2}" Tap="GoToPivot2_Tap" Width="Auto" Margin="0,0,25,0" Foreground="#FF727272" FontSize="30"/>
        </StackPanel>
    </controls:PivotItem>
</controls:Pivot>

それでおしまい。

イベントはあなたのものよりエレガントではないかもしれませんが、うまくいきます。

于 2013-12-11T07:57:25.047 に答える
0

私が見つけたのは、Visiblity を変更したり、Pivo​​tItem のヘッダーの高さを減らしたりしても、既にレンダリングされたアイテムでは (まだ?) 機能しないということです。これは単純に壊れていますが、上マージンを負の値に変更して PivotItem の最初の子要素を移動することで、これらの欠点を回避することができます。確かにエレガントではありませんが、機能しています。ここにいくつかのコードがあります:

<phone:PhoneApplicationPage.Resources>
    <local:SubtitleConverter x:Key="SubtitleConverter" />
    <local:MarginConverter x:Key="MarginConverter" />       
</phone:PhoneApplicationPage.Resources>

<controls:PivotItem Name="LayoutItem" Header="{Binding Path=MyProgramSettings.ShowHeader, Converter={StaticResource SubtitleConverter}}">
    <ListBox Margin="{Binding Path=MyProgramSettings.ShowHeader, Converter={StaticResource MarginConverter}}"> 
        <!-- element that is moved up and down depending on some property -->
    </ListBox>
</controls:PivotItem>

コードビハインド

public class SubtitleConverter : ConverterBase
    {
        public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {   
            /* should always return a non empty string, making the PivotItem header height predictable */
            /* needed for MarginConverter */
            return MyProgramSettings.ShowHeader ? " " : MyResource.SomeText.ToLower();
        }
    }

    public class MarginConverter : ConverterBase
    {
        public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool && (bool)value)
            {
                return new Thickness(12, 0, -28, 0);
            }
            return new Thickness(12, 0, -12, 0);
        }
    }
于 2012-06-07T15:05:30.803 に答える
0

ピボットのヘッダーの高さを、ヘッダー テキストが空/null (値 0?) に設定されているときに更新されるプロパティにバインドしようとしましたか?

それが機能する場合、別の方法として、Height プロパティをヘッダー テキストと同じ値にバインドし、コンバーターを使用することもできます (疑似: テキストが null の場合、高さに対して 0 を返します)。心配する余分なプロパティ。

于 2012-05-26T06:20:07.220 に答える