如何隐藏PivotItem?

时间:2011-04-03 18:27:03

标签: xaml silverlight windows-phone-7 pivot

我有一个Pivot控件的页面,在某些情况下我不想显示特定的PivotItem
Visibility设置为折叠似乎根本不会影响它。

有什么建议吗?

7 个答案:

答案 0 :(得分:14)

您应该能够通过在Pivot.Items上使用相应的集合方法在Pivot中动态删除或添加PivotItems。

如果这不符合您的情况,请告诉我。

答案 1 :(得分:10)

我已经创建了一个显示/隐藏透视图项

的自定义行为

用法:

< i:Interaction.Behaviors>
    < common:HideablePivotItemBehavior Visible="{Binding variable}" />
</ i:Interaction.Behaviors >

代码:

/// <summary>
/// Behavior which enables showing/hiding of a pivot item`
/// </summary>
public class HideablePivotItemBehavior : Behavior<PivotItem>
{
    #region Static Fields

    public static readonly DependencyProperty VisibleProperty = DependencyProperty.Register(
        "Visible",
        typeof(bool),
        typeof(HideablePivotItemBehavior),
        new PropertyMetadata(true, VisiblePropertyChanged));

    #endregion

    #region Fields

    private Pivot _parentPivot;

    private PivotItem _pivotItem;

    private int _previousPivotItemIndex;

    private int _lastPivotItemsCount;

    #endregion

    #region Public Properties

    public bool Visible
    {
        get
        {
            return (bool)this.GetValue(VisibleProperty);
        }

        set
        {
            this.SetValue(VisibleProperty, value);
        }
    }

    #endregion

    #region Methods

    protected override void OnAttached()
    {
        base.OnAttached();

        this._pivotItem = AssociatedObject;
    }

    private static void VisiblePropertyChanged(DependencyObject dpObj, DependencyPropertyChangedEventArgs change)
    {
        if (change.NewValue.GetType() != typeof(bool) || dpObj.GetType() != typeof(HideablePivotItemBehavior))
        {
            return;
        }

        var behavior = (HideablePivotItemBehavior)dpObj;
        var pivotItem = behavior._pivotItem;

        // Parent pivot has to be assigned after the visual tree is initialized
        if (behavior._parentPivot == null)
        {
            behavior._parentPivot = (Pivot)behavior._pivotItem.Parent;
            // if the parent is null return
            if (behavior._parentPivot == null)
            {
                return;
            }
        }

        var parentPivot = behavior._parentPivot;
        if (!(bool)change.NewValue)
        {
            if (parentPivot.Items.Contains(behavior._pivotItem))
            {
                behavior._previousPivotItemIndex = parentPivot.Items.IndexOf(pivotItem);
                parentPivot.Items.Remove(pivotItem);
                behavior._lastPivotItemsCount = parentPivot.Items.Count;
            }
        }
        else
        {
            if (!parentPivot.Items.Contains(pivotItem))
            {
                if (behavior._lastPivotItemsCount >= parentPivot.Items.Count)
                {

                    parentPivot.Items.Insert(behavior._previousPivotItemIndex, pivotItem);
                }
                else
                {
                    parentPivot.Items.Add(pivotItem);
                }
            }
        }
    }
    #endregion
}

答案 2 :(得分:7)

您可以从父透视图控件

中删除透视图项目
parentPivotControl.Items.Remove(pivotItemToBeRemoved);

答案 3 :(得分:1)

删除PivotItems很简单,但如果你想在之后将它们放回去,我发现标题混乱并开始相互重叠。如果您将标题的可见性设置为折叠,然后再将其设置为可见,也会发生这种情况。

所以我通过将每个不需要的PivotItem(及其标题)的不透明度设置为0来解决我的特定问题。

              PivotItem p = (PivotItem)MainPivot.Items.ToList()[indexToHide];
              p.Opacity = 0;
              ((UIElement)p.Header).Opacity = 0;

然而,这会留下缺少PivotItems的空白。

对我来说,差距不是问题,因为我只想删除PivotItemList末尾的项目,所以我在最后一个和第一个PivotItem之间得到一些空格。问题是,我仍然能够滑动到隐藏的PivotItem。为了解决这个问题,我重写了Pivot.SelectionChanged(),这样每当用户滑动到隐藏的PivotItem时,代码就会移动到下一个项目。我必须在SelectionChanged()中使用DispatchTimer并实际从DispatchTimer回调移动到下一个PivotItem,因为你必须在UI线程中更改PivotItem.SelectedIndex。

    private void MainPivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        t.Stop();   //t is my DispatchTimer, set to 100ms

        if (MainPivot.SelectedIndex >= mFirstHiddenPivotItemIndex)
        {
            //move to the first or last PivotItem, depending on the current index
            if (mCurrentSelectedPivotItemIndex == 0)
                mPivotItemToMoveTo = mFirstHiddenPivotItemIndex - 1;
            else 
                mPivotItemToMoveTo = 0;

            t.Start();
        }
        mCurrentSelectedPivotItemIndex = MainPivot.SelectedIndex;
    }

  private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        MainPivot.SelectedIndex = mPivotItemToMoveTo;
        t.Stop();
    }

答案 4 :(得分:0)

foreach (PivotItem item in MyPivot.Items.ToList())
{
    if (item.Visibility == Visibility.Collapsed)
        MyPivot.Items.Remove(item);
}

答案 5 :(得分:0)

IsLocked属性设置为true将使所有其他Pivot项目消失,但当前的轴项目除外。 但这不会隐藏我们选择的一个特定枢轴项目。

答案 6 :(得分:0)

详细说明添加/删除pivotItems的解决方案,而不是隐藏它们。

让我们说我们希望pivotItem最初是不可见的,并且仅出现在特定事件上。

mainPivot.Items.Remove(someTab);

然后再次添加,

 if (!mainPivot.Items.Cast<PivotItem>().Any(p => p.Name == "someTab"))
 {
      mainPivot.Items.Insert(1,someTab);
  }  

我使用了Insert而不是添加来控制标签出现的位置。 您必须确保不要将相同的标签添加两次,这就是if语句的原因。