0

我认为 PivotItem 的当前实现有些不一致,更不用说有缺陷了。如果在完全渲染之前或之后设置了属性 Header ,则适当地设置了标头的大小,但是,将 Header 设置回 null 或 string.empty 不会导致标头再次缩小。当通过 DataBinding 设置 Header 时,是否有一种隐藏和显示 PivotItem 标头的优雅方法,或者是否可以强制 PivotItem 重新验证其边界?

到目前为止,我正在尝试用一些相当粗略的代码“解决”我的问题,其中包括事件和以编程方式完全重建 Pivot,然后再次附加所有 PivotItems。可能只是页面的一个好的解决方案,但当需要完成 10 次以上时肯定有点不确定。

[这个问题以前类似的情况下被问过,但从未真正解决过。]

4

4 回答 4

1

您是否尝试仅删除一项的标题而保留其他标题?如果是这样,我不会推荐这个。这会很混乱。

如果尝试折叠所有这些,您可以将 PivotHeaderTemplate 的可见性绑定到一些东西。一个是您页面的 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 属性。

如果要将文本设置为标题的空值,可以使用值转换器

xml:

<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

您是否尝试过将枢轴的标题高度绑定到一个属性,该属性会随着您的标题文本设置为空/null(值 0?)

如果可行,也许您可​​以尝试的另一件事是将 Height 属性绑定到与标题文本相同的值,以及一个转换器(伪:如果文本为空,则返回 0 表示高度)- 这样您就没有需要担心的额外财产。

于 2012-05-26T06:20:07.220 回答
0

我发现更改 Visiblity 或降低 PivotItem 的标题高度根本不起作用(还没有?)在已经渲染的项目上。它只是被破坏了,但是可以通过将 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

好想法!我不完全使用您的解决方案,但我受到了您的想法的启发。

这是我所做的:

1.创建一个StackPanel作为容器,设置上边距为负值,如Margin="0,-35,0,0"

2.添加一些TextBlocks来伪造Pviot Headers,设置您打算与Headers绑定的数据绑定。

3.设置TextBlocks Width = "Auto",添加一些右边的Margin,这样就不会太拥挤

注意:当第一个 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 回答