Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在运行时隐藏和显示数据绑定的数据透视项标头_Wpf_Xaml_Data Binding_Windows Phone 7.1 - Fatal编程技术网

Wpf 在运行时隐藏和显示数据绑定的数据透视项标头

Wpf 在运行时隐藏和显示数据绑定的数据透视项标头,wpf,xaml,data-binding,windows-phone-7.1,Wpf,Xaml,Data Binding,Windows Phone 7.1,我认为PivotItem的当前实现有些不一致,更不用说有缺陷了。如果属性标头在完全渲染之前或之后设置,则标头的大小将适当设置,但是,将标头设置回null或string.empty不会导致标头再次收缩。当通过数据绑定设置数据透视项标题时,是否有一种优雅的方式隐藏和显示数据透视项标题,或者可以强制数据透视项重新验证其边界 到目前为止,我正试图用一些相当粗糙的代码来“解决”我的问题,这些代码包括事件和以编程方式重新创建透视,然后再次附加所有透视项。也许对于页面来说是一个不错的解决方案,但是当需要做10

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

到目前为止,我正试图用一些相当粗糙的代码来“解决”我的问题,这些代码包括事件和以编程方式重新创建透视,然后再次附加所有透视项。也许对于页面来说是一个不错的解决方案,但是当需要做10次以上的时候,肯定有点不确定


[这个问题已经在a中提出,但从未真正解决过。]

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


如果可以的话,您可以尝试的另一件事是将Height属性绑定到与标题文本相同的值,以及一个转换器(伪:如果文本为null,则返回0表示Height)-这样您就不用担心额外的属性了。

是否只删除一个项目的标题,而保留其他标题?如果是这样,我不建议这样做。这将非常令人困惑

如果试图折叠所有这些模板,可以将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>

我发现,更改数据透视项的可见性或降低数据透视项的页眉高度对已渲染的项目根本不起作用(现在还不行)。它只是被破坏了,但是可以通过将数据透视项的第一个子元素的上边距更改为负值来绕过这些缺点。诚然,这并不优雅,但很有效。下面是一些代码:

<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>
好主意! 我不完全使用你的解决方案,但我受到了你想法的启发

以下是我所做的:

1.创建一个StackPanel作为容器,将顶部边距设置为负值,例如
margin=“0,-35,0,0”

2.添加一些文本块来伪造Pviot标题,设置您打算与标题绑定的数据绑定

3.设置文本块
Width=“Auto”
,添加一些右边距,这样就不会太拥挤

注意:当第一个文本块表示当前数据透视项时,其他文本块表示其他文本块,这些文本块处于激活状态

4.对于激活的数据透视项中的文本块,我们设置
前台=“#FF727272”
,以与激活的数据透视项进行区分。还可以添加一个事件处理程序,例如
Tap=“GoToPivot2\u 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>

就这样


可能事件不如您的事件优雅,但也可以工作。

确实是一个非常好的解决方案,但我找不到任何Pivot标头属性。你能给我指一下正确的方向吗?谢谢你,肖恩。我试图一次隐藏或显示所有数据透视项标题。在渲染元素之前直接或通过数据绑定设置可见性(或负上边距)确实有效,我尝试了。但是,在运行期间,我只能增加标题使用的空间,并将可见性设置为可见性。折叠、将内容设置为null或将边距属性设置为具有负顶部值的特定厚度,除了隐藏或重新定位文本外,什么都做不了。这意味着第一次渲染时占用的空间仍将被占用。我相信第一个解决方案应该适合您(绑定可见性)。这不起作用吗?我两个都试过了,但不幸的是它们都不起作用。他们将使标题消失,但会留下一个很大的空白。与此同时,我提出了另一个相当古怪的修复方法,但它正在工作,并且可能比完全重新创建Pivot稍微优雅一些:首先,我在一个永远不会返回空字符串的转换器的帮助下,将PivotItem的头绑定到string属性。即使在它应该为空的情况下,我也会返回一个带空格的字符串,因此标题总是呈现在一定的高度上。最后一步是将数据透视项的边距绑定到相同的字符串属性。在需要隐藏标题的情况下,根据标题中使用的字体大小,Top属性的标题仅为负值。基本上,我将标题设置为空文本,并让数据透视项向上移动,模拟隐藏。稍后将发布一些代码。。。
<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);
        }
    }
<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>