Ответ 1
вы должны иметь возможность динамически удалять или добавлять PivotItems в свою Pivot с помощью соответствующих методов сбора данных на Pivot.Items.
Сообщите мне, если это не работает для вашего сценария.
У меня есть страница с Pivot
-control, и в некоторых случаях я не хочу показывать конкретный PivotItem
.
Установка сбрасывания Visibility
не влияет на нее вообще.
Любые предложения?
вы должны иметь возможность динамически удалять или добавлять PivotItems в свою Pivot с помощью соответствующих методов сбора данных на Pivot.Items.
Сообщите мне, если это не работает для вашего сценария.
Я создал настраиваемое поведение для отображения/скрытия элемента pivot
Использование:
< 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
}
Вы можете удалить опорный элемент из родительского элемента управления
parentPivotControl.Items.Remove(pivotItemToBeRemoved);
Удаление 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();
}
foreach (PivotItem item in MyPivot.Items.ToList())
{
if (item.Visibility == Visibility.Collapsed)
MyPivot.Items.Remove(item);
}
При установке свойства IsLocked
значение true приведет к исчезновению всех остальных элементов Pivot, за исключением текущего элемента поворота.
Но это не скроет один конкретный элемент поворота по нашему выбору.
Разрабатывать решение по добавлению/удалению pivotItems, а не скрывать их.
Скажем, мы хотим, чтобы pivotItem был изначально невидимым и отображался только на определенном событии.
mainPivot.Items.Remove(someTab);
Затем, чтобы добавить его снова,
if (!mainPivot.Items.Cast<PivotItem>().Any(p => p.Name == "someTab"))
{
mainPivot.Items.Insert(1,someTab);
}
Я использовал "Вставить", а не "Добавить", чтобы контролировать позицию, в которой отображается вкладка. Вы должны убедиться, что вы не добавляете одну и ту же вкладку дважды, что является причиной оператора if.