Windows Phone 7 中幻燈片視圖的翻頁效果 (Pivot)

openkk 13年前發布 | 28K 次閱讀 Windows Phone開發 移動開發 Windows Phone

在 iOS 中有一個 UIPageControl 用來進行界面的翻頁處理,而 Windows Phone 7 有一個 Pivot 控件可用來對內容進行分頁瀏覽,Pivot 控件要用在界面上具有相同的邏輯標題,例如將文章分開多頁顯示,如下圖顯示:

Windows Phone 7 中幻燈片視圖的翻頁效果 (Pivot)

該控件顯示在 XAML 中定義的當前頁,并通過一個 ElementName 的綁定來定義關聯的其他內容。

<local:PivotLocationView Source="{Binding ElementName=pivot}"
                          HorizontalAlignment="Center"

                          VerticalAlignment="Bottom"
                          Margin="0,0,0,10"/>

<controls:Pivot Margin="0,-30,0,40" 
                x:Name="pivot">
  <controls:PivotItem>

    ...
  </controls:PivotItem>
  <controls:PivotItem>
    ...
  </controls:PivotItem>
  <controls:PivotItem>
    ...
  </controls:PivotItem>

</controls:Pivot>

需要注意的是 Pivot 頂部有一部分空白,盡管你并沒有為該控件定義頭。

PivotLocationView 用戶控件使用簡單的視圖模式,每個展示視圖有一個 model-items 項。當一個視圖關聯上一個 Pivot 控件,它會為每個 Pivot Item 創建一個子視圖模型,然后處理 SelectionChanged 事件用來保存選中的狀態:

public class PivotLocationViewModel
{
  private Pivot _pivot;

  public PivotLocationViewModel()
  {
  }

  public PivotLocationViewModel(Pivot pivot)
  {
    PivotItems = new PivotItemViewModelCollection();
    SetPivot(pivot);
  }

  /// <summary>
  /// Gets or sets the collection of child view-models
  /// </summary>
  public PivotItemViewModelCollection PivotItems { get; set; }

  private void SetPivot(Pivot pivot)
  {
    _pivot = pivot;

    // handle selection changed
    pivot.SelectionChanged += Pivot_SelectionChanged;

    // create a view model for each pivot item.
    for(int i=0;i<pivot.Items.Count;i++)
    {
      PivotItems.Add(new PivotItemViewModel());
    }

    // set the initial selection
    PivotItems[_pivot.SelectedIndex].IsSelected = true;
  }

  /// <summary>

  /// Handle selection changes to update the view model
  /// </summary>
  private void  Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)
  {
      var selectedModel = PivotItems.SingleOrDefault(p => p.IsSelected);
    if (selectedModel != null)
      selectedModel.IsSelected = false;

    PivotItems[_pivot.SelectedIndex].IsSelected = true;
  }
}

每個 Pivot Item 關聯的視圖模型實現了 INotifyPropertyChanged 接口,包含一個 IsSelected 屬性用來反映 Pivot 的選擇狀態,同時還包含一個 Color 屬性可以設定每個視圖的顏色:

/// <summary>
/// A view model for each 'pip'
/// </summary>

public class PivotItemViewModel : INotifyPropertyChanged
{
  // ... INotifyPropertyChanged implementation

  private bool _isSelected;

  public bool IsSelected
  {
    get { return _isSelected; }
    set
    {
      if (_isSelected == value)
        return;

      _isSelected = value;
      OnPropertyChanged("IsSelected");
      Color = IsSelected ? Colors.Black : Colors.White;
    }
  }

  private Color _color;

  public Color Color
  {
    get { return _color; }
    set
    {
      _color = value;
      OnPropertyChanged("Color");
    }
  }
}

XAML 定義非常簡單,為每個 pip 設定一個 ItemsControl:

<UserControl ...
    d:DataContext="{d:DesignData Source=PivotLocationViewModel.xml}">

  <Grid x:Name="LayoutRoot">

    <ItemsControl ItemsSource="{Binding PivotItems}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>

      </ItemsControl.ItemsPanel>
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <Ellipse Width="12" Height="12" Margin="15,0,15,0"

                   Stroke="Black"
                   StrokeThickness="0.5">
            <Ellipse.Fill>
              <SolidColorBrush Color="{Binding Color}"/>
            </Ellipse.Fill>

          </Ellipse>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </Grid>
</UserControl>

注意使用設計時數據,下面文件定義一個視圖模型實例:

<PivotLocationViewModel xmlns="clr-namespace:SlideView">
  <PivotLocationViewModel.PivotItems>
    <PivotItemViewModelCollection>
      <PivotItemViewModel IsSelected="False" Color="Red"/>

      <PivotItemViewModel IsSelected="True"  Color="Green"/>
      <PivotItemViewModel IsSelected="False"  Color="Red"/>
      <PivotItemViewModel IsSelected="False"  Color="Red"/>

    </PivotItemViewModelCollection>
  </PivotLocationViewModel.PivotItems>
</PivotLocationViewModel>

設計器:

qw.jpg

完,你可以下載完整的源碼:SlideView.zip

本文翻譯自:http://www.codeproject.com/Articles/297177/A-Windows-Phone-7-Slide-View-with-Page-Pips

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!