Как мне скрыть PivotItem? - PullRequest
15 голосов
/ 03 апреля 2011

У меня есть страница с Pivot -контролем, и в некоторых случаях я не хочу показывать конкретный PivotItem.
Установка свернутого Visibility, похоже, никак не влияет.

Есть предложения?

Ответы [ 7 ]

14 голосов
/ 04 апреля 2011

вы должны иметь возможность динамически удалять или добавлять PivotItems в Pivot, используя соответствующие методы сбора в Pivot.Items.

Дайте мне знать, если это не работает для вашего сценария.

10 голосов
/ 06 августа 2014

Я создал пользовательское поведение для отображения / скрытия сводного элемента

Использование:

< 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
}
7 голосов
/ 16 февраля 2012

Вы можете удалить элемент сводки из родительского элемента управления сводкой

parentPivotControl.Items.Remove(pivotItemToBeRemoved);
1 голос
/ 20 февраля 2014

Удалить PivotItems легко, но если вы захотите потом вернуть их обратно, я обнаружил, что заголовки перепутаны и начинают накладываться друг на друга.Это также происходит, если вы установите для параметра Видимость заголовка значение Свернуть, а затем снова сделаете его видимым.

Поэтому я решил свою конкретную проблему, установив непрозрачность каждого нежелательного элемента PivotItem (и его заголовка) на 0.

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

Тем не менее, это оставляет пробелы, в которых отсутствуют отсутствующие PivotItems.

Для меня пробелы не были проблемой, потому что я хочу удалить элементы только в конце моего PivotItemList, поэтому яполучить пробел между последним и первым PivotItems.Проблема была в том, что я все еще был в состоянии провести к скрытому элементу PivotItem.Чтобы это исправить, я переопределил Pivot.SelectionChanged (), так что всякий раз, когда пользователь перемещается к скрытому PivotItem, код переходит к следующему элементу.Мне пришлось использовать DispatchTimer изнутри SelectionChanged () и фактически перейти к следующему PivotItem из обратного вызова DispatchTimer, поскольку для изменения 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();
    }
0 голосов
/ 08 октября 2015

Чтобы разработать решение добавления / удаления сводных элементов, а не скрывать их.

Допустим, мы хотим, чтобы pivotItem был изначально невидимым и появлялся только для определенного события.

mainPivot.Items.Remove(someTab);

Затем, чтобы добавить его снова,

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

IИспользовать Вставить, а не добавить, чтобы контролировать положение, где появляется вкладка.Вы должны убедиться, что не добавляете одну и ту же вкладку дважды, что является причиной для оператора if.

0 голосов
/ 17 июля 2013

Если для свойства IsLocked установлено значение true, все остальные элементы сводки исчезнут, кроме текущего элемента сводки.Но это не скроет один конкретный элемент поворота по нашему выбору.

0 голосов
/ 28 января 2013
foreach (PivotItem item in MyPivot.Items.ToList())
{
    if (item.Visibility == Visibility.Collapsed)
        MyPivot.Items.Remove(item);
}
...