赞
踩
样式如下:
- public class NewsItem
- {
- public int Id { get; set; }
- public DateTime DateCreated { get; set; }
- public string Title { get; set; }
- public string Text { get; set; }
- }
- private static List<NewsItem> _items = new List<NewsItem>()
-
- {
-
- new NewsItem()
- {}……
- }
-
- public static IList<NewsItem> GetAllItems()
- {
- return _items;
- }
-
- public static NewsItem GetItemById(int id)
- {
- return _items[id];
- }

- <Grid x:Name="gridMain" >
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="0" />
- </Grid.ColumnDefinitions>
- <Frame x:Name="masterFrame" Grid.Column="0" mvvm:StageManager.Beacon="masterFrame" x:FieldModifier="public"/>
- <Frame x:Name="detailFrame" HorizontalAlignment="Stretch" Grid.Column="1" mvvm:StageManager.Beacon="detailFrame" x:FieldModifier="public">
- </Frame>
- </Grid>
-
- protected override async Task OnBindedViewLoad(MVVMSidekick.Views.IView view)
- {
- await base.OnBindedViewLoad(view);
- await StageManager["masterFrame"].Show(new MasterPage_Model());
-
- }
-
- xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
- xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
- xmlns:Behaviors="using:MVVMSidekick.Behaviors"
- <Interactivity:Interaction.Behaviors>
- <Core:EventTriggerBehavior EventName="Tapped">
- <Behaviors:SendToEventRouterAction EventRoutingName="NewsItemTapped" EventData="{Binding}" IsEventFiringToAllBaseClassesChannels="True" />
- </Core:EventTriggerBehavior>
- </Interactivity:Interaction.Behaviors>
- private void RegisterCommand()
- {
- MVVMSidekick.EventRouting.EventRouter.Instance.GetEventChannel<Object>()
- .Where(x => x.EventName == "NewsItemTapped")
- .Subscribe(
- e =>
- {
- NewsItem item = e.EventData as NewsItem;
- await StageManager["detailFrame"].Show(new DetailPage_Model(item));
- }
- ).DisposeWith(this);
- }
别忘了在Loaded事件里调用这个方法:
-
- protected override async Task OnBindedViewLoad(MVVMSidekick.Views.IView view)
- {
- this.RegisterCommand();
- await base.OnBindedViewLoad(view);
- await StageManager["masterFrame"].Show(new MasterPage_Model());
- }
-
- public DetailPage_Model()
- { }
-
-
- public DetailPage_Model(NewsItem item)
- {
- CurrentNewsItem = item;
- }
-
-
-
- public NewsItem CurrentNewsItem
- {
- get { return _CurrentNewsItemLocator(this).Value; }
- set { _CurrentNewsItemLocator(this).SetValueAndTryNotify(value); }
- }
-
- #region Property NewsItem CurrentNewsItem Setup
-
- protected Property<NewsItem> _CurrentNewsItem = new Property<NewsItem> { LocatorFunc = _CurrentNewsItemLocator };
-
- static Func<BindableBase, ValueContainer<NewsItem>> _CurrentNewsItemLocator = RegisterContainerLocator<NewsItem>("CurrentNewsItem", model => model.Initialize("CurrentNewsItem", ref model._CurrentNewsItem, ref _CurrentNewsItemLocator, _CurrentNewsItemDefaultValueFactory));
-
- static Func<NewsItem> _CurrentNewsItemDefaultValueFactory = () => { return default(NewsItem); };
-
- #endregion

- <StackPanel x:Name="RootPanel" Grid.Row="1">
- <TextBlock
- Margin="8,0"
- Style="{ThemeResource TitleTextBlockStyle}"
- HorizontalAlignment="Left"
- Text="{Binding CurrentNewsItem.Title}" />
- <TextBlock
- Margin="12,8"
- HorizontalAlignment="Left"
- MaxWidth="560"
- Style="{ThemeResource BodyTextBlockStyle}"
- Text="{Binding CurrentNewsItem.Text}"
- EntranceNavigationTransitionInfo.IsTargetElement="True" />
- </StackPanel>
- protected override async Task OnBindedViewLoad(MVVMSidekick.Views.IView view)
- {
- this.RegisterCommand();
- await base.OnBindedViewLoad(view);
- StageManager["detailFrame"].Show(new BlankPage_Model());
- await StageManager["masterFrame"].Show(new MasterPage_Model());
- }
- public enum MasterDetailState
- {
- /// <summary>
- /// narrow and a blank detail page
- /// </summary>
- NarrowAndBlankDetail,
-
- /// <summary>
- /// narrow and detail page is not blank
- /// </summary>
- NarrowAndNoBlankDetail,
-
- /// <summary>
- /// wide
- /// </summary>
- Wide
- }

- MVVMPage detailPage = (MVVMSidekick.Views.MVVMPage)DetailContent;
- if (detailPage != null)
- {
- if (detailPage.BaseUri.ToString() == "ms-appx:///BlankPage.xaml")
- {
- System.Diagnostics.Debug.WriteLine("触发NarrowAndBlankDetail模式");
- //CommonContext.Instance.CurrentBackRequestedHandlerType = BackRequestedHandlerType.MasterPage;
- return MasterDetailState.NarrowAndBlankDetail;
- }
- else
- {
- System.Diagnostics.Debug.WriteLine("触发NarrowAndNoBlankDetail模式");
- //CommonContext.Instance.CurrentBackRequestedHandlerType = BackRequestedHandlerType.DetailPage;
- return MasterDetailState.NarrowAndNoBlankDetail;
- }
- }

- public class MasterDetailStateTrigger : StateTriggerBase, ITriggerValue
-
- {
-
-
-
-
-
- public MasterDetailStateTrigger()
-
- {
-
- if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
-
- {
-
-
-
- var weakEvent =
-
- new WeakEventListener<MasterDetailStateTrigger, ApplicationView, object>(this)
-
- {
-
- OnEventAction = (instance, source, eventArgs) => MasterDetailStatetateTrigger_MasterDetailStateChanged(source, eventArgs),
-
- OnDetachAction = (instance, weakEventListener) => ApplicationView.GetForCurrentView().VisibleBoundsChanged -= weakEventListener.OnEvent
-
- };
-
- ApplicationView.GetForCurrentView().VisibleBoundsChanged += weakEvent.OnEvent;
-
-
-
- }
-
- }
-
-
-
- private void MasterDetailStatetateTrigger_MasterDetailStateChanged(ApplicationView sender, object args)
-
- {
-
- UpdateTrigger();
-
- }
-
-
-
- private void UpdateTrigger()
-
- {
-
- IsActive = GetMasterDetailState() == MasterDetailState;
-
-
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- public MasterDetailState MasterDetailState
-
- {
-
- get { return (MasterDetailState)GetValue(MasterDetailStateProperty); }
-
- set { SetValue(MasterDetailStateProperty, value); }
-
- }
-
-
-
- // Using a DependencyProperty as the backing store for MasterDetailState. This enables animation, styling, binding, etc...
-
- public static readonly DependencyProperty MasterDetailStateProperty =
-
- DependencyProperty.Register("MasterDetailState", typeof(MasterDetailState), typeof(MasterDetailStateTrigger), new PropertyMetadata(MasterDetailState.Wide, OnMasterDetailStatePropertyChanged));
-
-
-
- private static void OnMasterDetailStatePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
-
- {
-
-
-
- var obj = (MasterDetailStateTrigger)d;
-
- if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
-
- {
-
- obj.UpdateTrigger();
-
- }
-
- }
-
-
-
-
-
-
-
-
-
-
-
- public object DetailContent
-
- {
-
- get { return (object)GetValue(DetailContentProperty); }
-
- set { SetValue(DetailContentProperty, value); }
-
- }
-
-
-
- // Using a DependencyProperty as the backing store for DetailContent. This enables animation, styling, binding, etc...
-
- public static readonly DependencyProperty DetailContentProperty =
-
- DependencyProperty.Register("DetailContent", typeof(object), typeof(MasterDetailStateTrigger), new PropertyMetadata(null, new PropertyChangedCallback(OnValuePropertyChanged)));
-
-
-
- private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
-
- {
-
- var obj = (MasterDetailStateTrigger)d;
-
- obj.UpdateTrigger();
-
- }
-
-
-
-
-
-
-
-
-
- internal MasterDetailState GetMasterDetailState()
-
- {
-
- System.Diagnostics.Debug.WriteLine("DetailContent为空:" + (DetailContent == null).ToString());
-
- //第一种 窄屏模式 DetailFrame为空
-
- if (Window.Current.Bounds.Width < 720)
-
- {
-
- System.Diagnostics.Debug.WriteLine("VisibleBounds.Width:" + ApplicationView.GetForCurrentView().VisibleBounds.Width.ToString());
-
- System.Diagnostics.Debug.WriteLine("Window.Current.Bounds:" + Window.Current.Bounds.Width.ToString());
-
- MVVMPage detailPage = (MVVMSidekick.Views.MVVMPage)DetailContent;
-
- if (detailPage != null)
-
- {
-
- if (detailPage.BaseUri.ToString() == "ms-appx:///BlankPage.xaml")
-
- {
-
- System.Diagnostics.Debug.WriteLine("触发NarrowAndBlankDetail模式");
-
- return MasterDetailState.NarrowAndBlankDetail;
-
- }
-
- else
-
- {
-
- System.Diagnostics.Debug.WriteLine("触发NarrowAndNoBlankDetail模式");
-
- return MasterDetailState.NarrowAndNoBlankDetail;
-
- }
-
- }
-
- else
-
- {
-
- return MasterDetailState.NarrowAndBlankDetail;
-
- }
-
- }
-
- else
-
- {
-
- System.Diagnostics.Debug.WriteLine("触发Wide模式");
-
- return MasterDetailState.Wide;
-
- }
-
- }
-
-
-
-
-
-
-
- #region ITriggerValue
-
-
-
- private bool m_IsActive;
-
-
-
- /// <summary>
-
- /// Gets a value indicating whether this trigger is active.
-
- /// </summary>
-
- /// <value><c>true</c> if this trigger is active; otherwise, <c>false</c>.</value>
-
- public bool IsActive
-
- {
-
- get { return m_IsActive; }
-
- private set
-
- {
-
- if (m_IsActive != value)
-
- {
-
- m_IsActive = value;
-
- base.SetActive(value);
-
- if (IsActiveChanged != null)
-
- IsActiveChanged(this, EventArgs.Empty);
-
- }
-
- }
-
- }
-
-
-
- /// <summary>
-
- /// Occurs when the <see cref="IsActive" /> property has changed.
-
- /// </summary>
-
- public event EventHandler IsActiveChanged;
-
-
-
- #endregion ITriggerValue
-
-
-
-
-
-
-
- }
-
-
-
- public enum MasterDetailState
-
- {
-
- /// <summary>
-
- /// narrow and a blank detail page
-
- /// </summary>
-
- NarrowAndBlankDetail,
-
- /// <summary>
-
- /// narrow and detail page is not blank
-
- /// </summary>
-
- NarrowAndNoBlankDetail,
-
- /// <summary>
-
- /// wide
-
- /// </summary>
-
- Wide
-
- }

- /// <summary>
- /// detailFrame的内容
- /// </summary>
- public object DetailContent
- {
- get { return _DetailContentLocator(this).Value; }
- set { _DetailContentLocator(this).SetValueAndTryNotify(value); }
- }
-
- #region Property object DetailContent Setup
-
- protected Property<object> _DetailContent = new Property<object> { LocatorFunc = _DetailContentLocator };
-
- static Func<BindableBase, ValueContainer<object>> _DetailContentLocator = RegisterContainerLocator<object>("DetailContent", model => model.Initialize("DetailContent", ref model._DetailContent, ref _DetailContentLocator, _DetailContentDefaultValueFactory));
-
- static Func<object> _DetailContentDefaultValueFactory = () => default(object);
-
- #endregion

-
- <Frame x:Name="detailFrame" Content="{Binding DetailContent,Mode=TwoWay}" HorizontalAlignment="Stretch" Grid.Column="1" mvvm:StageManager.Beacon="detailFrame" x:FieldModifier="public">
-
- <VisualStateManager.VisualStateGroups>
- <VisualStateGroup>
- <VisualState x:Name="NarrowAndBlankDetail">
- <VisualState.StateTriggers>
- <triggers:MasterDetailStateTrigger MasterDetailState="NarrowAndBlankDetail" DetailContent="{Binding DetailContent}" />
- </VisualState.StateTriggers>
- <VisualState.Setters>
- <Setter Target="gridMain.ColumnDefinitions[0].Width" Value="*" />
- <Setter Target="gridMain.ColumnDefinitions[1].Width" Value="0" />
- </VisualState.Setters>
- </VisualState>
- <VisualState x:Name="NarrowAndNoBlankDetail">
- <VisualState.StateTriggers>
- <triggers:MasterDetailStateTrigger MasterDetailState="NarrowAndNoBlankDetail" DetailContent="{Binding DetailContent}" />
- </VisualState.StateTriggers>
- <VisualState.Setters>
- <Setter Target="gridMain.ColumnDefinitions[0].Width" Value="0" />
- <Setter Target="gridMain.ColumnDefinitions[1].Width" Value="*" />
- </VisualState.Setters>
- </VisualState>
- <VisualState x:Name="Wide">
- <VisualState.StateTriggers>
- <triggers:MasterDetailStateTrigger MasterDetailState="Wide" DetailContent="{Binding DetailContent}" />
- </VisualState.StateTriggers>
- <VisualState.Setters>
- <Setter Target="gridMain.ColumnDefinitions[0].Width" Value="2*" />
- <Setter Target="gridMain.ColumnDefinitions[1].Width" Value="3*" />
- </VisualState.Setters>
- </VisualState>
- </VisualStateGroup>
- </VisualStateManager.VisualStateGroups>

- <Grid x:Name="gridMain" >
- <Grid.RenderTransform>
- <CompositeTransform />
- </Grid.RenderTransform>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="*" />
- <ColumnDefinition Width="0" />
- </Grid.ColumnDefinitions>
- <Frame x:Name="masterFrame" Grid.Column="0" mvvm:StageManager.Beacon="masterFrame" x:FieldModifier="public"/>
- <Frame x:Name="detailFrame" Content="{Binding DetailContent,Mode=TwoWay}" HorizontalAlignment="Stretch" Grid.Column="1" mvvm:StageManager.Beacon="detailFrame" x:FieldModifier="public">
- </Frame>
-
- </Grid>
四、处理返回键
- protected override void OnNavigatedTo(NavigationEventArgs e)
- {
- SystemNavigationManager.GetForCurrentView().BackRequested += CurrentView_BackRequested;
- //SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
- base.OnNavigatedTo(e);
- }
-
-
-
- protected override void OnNavigatedFrom(NavigationEventArgs e)
- {
- SystemNavigationManager.GetForCurrentView().BackRequested -= CurrentView_BackRequested;
- base.OnNavigatedFrom(e);
- }
-
-
-
- private void CurrentView_BackRequested(object sender, BackRequestedEventArgs e)
- {
- //判断DetailPage能否GoBack,如果可以GoBack则GoBack 显示BlankPage
- //其次判断MasterPage能否GoBack,如果可以GoBack则GoBack
- //如果不能GoBack,则提示是否退出
- if (StrongTypeViewModel.StageManager["detailFrame"].CanGoBack)
- {
- e.Handled = true;
- StrongTypeViewModel.StageManager["detailFrame"].Frame.GoBack();
- }
- else if (StrongTypeViewModel.StageManager["masterFrame"].CanGoBack)
- {
- e.Handled = true;
- StrongTypeViewModel.StageManager["masterFrame"].Frame.GoBack();
- }
- else
- {
- //TODO 隐藏回退键 提示退出
- SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Collapsed;
- }
- }

- private void RegisterCommand()
- {
- MVVMSidekick.EventRouting.EventRouter.Instance.GetEventChannel<Object>()
- .Where(x => x.EventName == "NewsItemTapped")
- .Subscribe(
- async e =>
- {
- NewsItem item = e.EventData as NewsItem;
- SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
- await StageManager["detailFrame"].Show(new DetailPage_Model(item));
- }
- ).DisposeWith(this);
- }
五、添加切换动画效果
- <Storyboard >
- <DoubleAnimation Storyboard.TargetName="gridMain" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:0.6">
- <DoubleAnimation.EasingFunction>
- <CircleEase EasingMode="EaseOut" />
- </DoubleAnimation.EasingFunction>
- </DoubleAnimation>
- <DoubleAnimation Storyboard.TargetName="gridMain" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" From="-100" To="0" Duration="0:0:0.3">
- <DoubleAnimation.EasingFunction>
- <CircleEase EasingMode="EaseOut" />
- </DoubleAnimation.EasingFunction>
- </DoubleAnimation>
- </Storyboard>
-
- <VisualStateGroup.Transitions>
- <VisualTransition From="NarrowAndNoBlankDetail" To="NarrowAndBlankDetail" ></VisualTransition>
- </VisualStateGroup.Transitions>
-
-
- <Grid.RenderTransform>
- <CompositeTransform />
- </Grid.RenderTransform>
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。