zoukankan      html  css  js  c++  java
  • <Toolkit>———LockablePivot

    Toolkit中LockablePivot的外部属性、方法如下:

     1 namespace Microsoft.Phone.Controls
     2 {
     3     // Summary:
     4     //     The lockable Pivot extends the base Pivot control with a property that disables
     5     //     navigation between Pivot items.
     6     [StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(PivotItem))]
     7     [TemplatePart(Name = "HeadersListElement", Type = typeof(PivotHeadersControl))]
     8     [TemplatePart(Name = "PivotItemPresenter", Type = typeof(ItemsPresenter))]
     9     public class LockablePivot : Pivot
    10     {
    11         // Summary:
    12         //     Identifies the IsLocked dependency property.
    13         public static readonly DependencyProperty IsLockedProperty;
    14 
    15         // Summary:
    16         //     Initializes a new instance of the LockablePivot type.
    17         public LockablePivot();
    18 
    19         // Summary:
    20         //     Gets or sets a value indicating whether the control is locked.
    21         public bool IsLocked { get; set; }
    22 
    23         // Summary:
    24         //     Invoked when the Items property changes.
    25         //
    26         // Parameters:
    27         //   e:
    28         //     Information about the change.
    29         protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e);
    30     }
    31 }

    从中我们只看出LockablePivot是继承自Pivot,并且只有一个IsLocked属性可以用,所以可知LockablePivot使用和Pivot基本一致。

    下面我们看一下IsLocked使用效果:

    (未锁效果,可左右滑动)                             (锁住效果,这个时候LockablePivot中只有一个PivotItem)

    锁住的时候为什么LockablePivot只有一个PivotItem呢?

    其实我们把LockablePivot反编译一下就知道原因了。(下面是一段反编译代码)

     1 private void OnIsLockedChanged(bool newValue)
     2 {
     3     this._isLocked = newValue;
     4     this._isUpdating = true;
     5     if (this._isLocked)
     6     {
     7         this._savedIndex = base.get_SelectedIndex();
     8         this.FadeOutHeaders();
     9         this.SaveAndRemoveItems();
    10     }
    11     else
    12     {
    13         this.RestoreItems();
    14         this.FadeInHeaders();
    15     }
    16     this._isUpdating = false;
    17 }
    18 
    19  

    从中我们可以看出LockablePivot的实现原理:

      当IsLocked设置为true的时候,LockablePivot会保存当前的PivotItem项,然后把其他的PivotItem从LockablePivot中移除保存起来。

      当IsLocked设置为false的时候再将保存的PivotItem移回LockablePivot中。

    下面是一个LockablePivot的简单使用例子:

    TestCtrlPage.xaml
     1 <phone:PhoneApplicationPage 
     2     x:Class="TestLstBoxDemo.TestPage.TestCtrlPage"
     3     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     4     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     5     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
     6     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
     7     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     8     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     9     FontFamily="{StaticResource PhoneFontFamilyNormal}"
    10     FontSize="{StaticResource PhoneFontSizeNormal}"
    11     Foreground="{StaticResource PhoneForegroundBrush}"
    12     SupportedOrientations="Portrait" Orientation="Portrait"
    13     mc:Ignorable="d" d:DesignHeight="696" d:DesignWidth="480"
    14     shell:SystemTray.IsVisible="True" 
    15     xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit" 
    16     xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
    17     xmlns:my="clr-namespace:SinOrMulListBox;assembly=SinOrMulListBox" 
    18     d:DataContext="{d:DesignData ../Design/ViewModelSampleData.xaml}">
    19 
    20     <!--LayoutRoot is the root grid where all page content is placed-->
    21     <toolkit:LockablePivot x:Name="LockPivot" Title="Use LockablePivot">
    22         <toolkit:LockablePivot.Resources>
    23             <ResourceDictionary>
    24                 <Style TargetType="TextBlock" x:Key="TBlock">
    25                     <Setter Property="Margin" Value="0,0,0,-10"/>
    26                     <Setter Property="FontSize" Value="60"/>
    27                 </Style>
    28             </ResourceDictionary>
    29         </toolkit:LockablePivot.Resources>
    30         <controls:PivotItem>
    31             <controls:PivotItem.Header>
    32                 <TextBlock Text="LockItem1" Style="{StaticResource TBlock}"/>
    33             </controls:PivotItem.Header>
    34             <Grid>
    35                 <my:SinOrMulListBox Name="listBoxWithBoxes" Margin="0,0,0,0"  IsMultipleSelect="True" ItemsSource="{Binding SimpleModels}">
    36                     <my:SinOrMulListBox.ItemTemplate>
    37                         <DataTemplate>
    38                             <StackPanel Orientation="Horizontal" Margin="0,0,0,20">
    39                                 <Rectangle Height="100" Width="100" Fill="#FFE5001b" Margin="0,0,9,0"/>
    40                                 <StackPanel>
    41                                     <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextLargeStyle}"/>
    42                                     <TextBlock Text="{Binding Description}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
    43                                 </StackPanel>
    44                             </StackPanel>
    45                         </DataTemplate>
    46                     </my:SinOrMulListBox.ItemTemplate>
    47                 </my:SinOrMulListBox>
    48             </Grid>
    49         </controls:PivotItem>
    50         <controls:PivotItem>
    51             <controls:PivotItem.Header>
    52                 <TextBlock Text="LockItem2" Style="{StaticResource TBlock}"/>
    53             </controls:PivotItem.Header>
    54             <Grid />
    55         </controls:PivotItem>
    56     </toolkit:LockablePivot>
    57 
    58     <!--Sample code showing usage of ApplicationBar-->
    59     <phone:PhoneApplicationPage.ApplicationBar>
    60         <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
    61             <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Lock" Click="Lock_Click"/>
    62             <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="UnLock" Click="UnLock_Click"/>
    63 
    64             <shell:ApplicationBar.MenuItems>
    65                 <shell:ApplicationBarMenuItem Text="开启单选" Click="ApplicationBarMenuItem_Click"/>
    66                 <shell:ApplicationBarMenuItem Text="开启多选" Click="ApplicationBarMenuItem_Click_1"/>
    67             </shell:ApplicationBar.MenuItems>
    68         </shell:ApplicationBar>
    69     </phone:PhoneApplicationPage.ApplicationBar>
    70 
    71 </phone:PhoneApplicationPage>
    TestCtrlPage.xaml.cs
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Net;
     5 using System.Windows;
     6 using System.Windows.Controls;
     7 using System.Windows.Documents;
     8 using System.Windows.Input;
     9 using System.Windows.Media;
    10 using System.Windows.Media.Animation;
    11 using System.Windows.Shapes;
    12 using Microsoft.Phone.Controls;
    13 
    14 namespace TestLstBoxDemo.TestPage
    15 {
    16     public partial class TestCtrlPage : PhoneApplicationPage
    17     {
    18         public TestCtrlPage()
    19         {
    20             InitializeComponent();
    21 
    22             this.Loaded += new RoutedEventHandler(LockablePivot_Loaded);
    23         }
    24 
    25         void LockablePivot_Loaded(object sender, RoutedEventArgs e)
    26         {
    27             DataContext = App.ViewModel;
    28         }
    29 
    30         protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    31         {
    32             if (!App.ViewModel.IsDataLoaded)
    33             {
    34                 App.ViewModel.LoadData();
    35             }
    36             base.OnNavigatedTo(e);
    37         }
    38 
    39         private void Lock_Click(object sender, EventArgs e)
    40         {
    41             this.LockPivot.IsLocked = true;
    42         }
    43 
    44         private void UnLock_Click(object sender, EventArgs e)
    45         {
    46             this.LockPivot.IsLocked = false;
    47         }
    48 
    49         //开启单选
    50         private void ApplicationBarMenuItem_Click(object sender, EventArgs e)
    51         {
    52             listBoxWithBoxes.IsMultipleSelect = false;
    53         }
    54         //开启多选
    55         private void ApplicationBarMenuItem_Click_1(object sender, EventArgs e)
    56         {
    57             listBoxWithBoxes.IsMultipleSelect = true;
    58         }
    59     }
    60 }

    源码

  • 相关阅读:
    【Jenkins】jenkins 配置腾讯企业邮箱
    Monkey 用户指南(译)
    Windows,easygui 安装
    python笔记:list--pop与remove的区别
    递归--Java_汉诺塔
    appium安装 For windows
    【web开发--js学习】functionName 如果是一个属性值,函数将不会被调用
    python爬取煎蛋网图片
    pv&pvc
    docker
  • 原文地址:https://www.cnblogs.com/qq278360339/p/2729192.html
Copyright © 2011-2022 走看看