我有一个Pivot
控件的页面,在某些情况下我不想显示特定的PivotItem
。
将Visibility
设置为折叠似乎根本不会影响它。
有什么建议吗?
答案 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语句的原因。