Working player contained within main page and control delegated to viewmodels
This commit is contained in:
@ -11,8 +11,14 @@ using Aurora.Design.Components.MediaPlayer;
|
||||
|
||||
namespace Aurora.Design.Views.Main
|
||||
{
|
||||
/// <summary>
|
||||
/// Delegate for updating player metadata
|
||||
/// </summary>
|
||||
/// <param name="media"></param>
|
||||
public delegate void SetPlayerMetadataDelegate(BaseMedia media);
|
||||
|
||||
[XamlCompilation(XamlCompilationOptions.Compile)]
|
||||
public partial class MainView : MasterDetailPage
|
||||
public partial class MainView : MasterDetailPage, IDisposable
|
||||
{
|
||||
private Dictionary<int, BaseViewModel> _viewModels;
|
||||
private BaseViewModel _lastViewModel;
|
||||
@ -26,16 +32,17 @@ namespace Aurora.Design.Views.Main
|
||||
|
||||
Appearing += OnAppearing;
|
||||
}
|
||||
~MainView()
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Appearing -= OnAppearing;
|
||||
}
|
||||
|
||||
public Command PlayCommand { get; set; }
|
||||
public Command PreviousCommand { get; set; }
|
||||
public Command NextCommand { get; set; }
|
||||
public BaseMedia Media { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Event handler for side bar items being selected
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void OnNavItemSelected(object sender, SelectedItemChangedEventArgs e)
|
||||
{
|
||||
var item = e.SelectedItem as NavigationItem;
|
||||
@ -60,24 +67,22 @@ namespace Aurora.Design.Views.Main
|
||||
//Instantiate new view model
|
||||
vm = (BaseViewModel)Activator.CreateInstance(item.TargetViewModelType);
|
||||
_viewModels.Add(item.Id, vm);
|
||||
}
|
||||
|
||||
//Assign player controls to viewmodel
|
||||
Player player = (Player)ContentPage.FindByName("Player");
|
||||
player.PlayButtonCommand = new Command(vm.PlayExecute, vm.PlayCanExecute);
|
||||
player.NextButtonCommand = new Command(vm.NextExecute, vm.NextCanExecute);
|
||||
player.PreviousButtonCommand = new Command(vm.PreviousExecute, vm.PreviousCanExecute);
|
||||
vm.Media = this.Media;
|
||||
}
|
||||
|
||||
//Activate viewmodel
|
||||
vm.OnActive();
|
||||
|
||||
//Deactivate last viewModel
|
||||
_lastViewModel.OnInactive();
|
||||
//Unasign deactivating vm
|
||||
UnassignPlayerControls(_lastViewModel);
|
||||
|
||||
//Assign viewModel
|
||||
_lastViewModel = vm;
|
||||
view.BindingContext = vm;
|
||||
//Assign player controls to viewmodel
|
||||
AssignPlayerControls(vm);
|
||||
|
||||
ContentPresenter viewContent = (ContentPresenter)ContentPage.Content.FindByName("ViewContent");
|
||||
viewContent.Content = view;
|
||||
@ -113,19 +118,50 @@ namespace Aurora.Design.Views.Main
|
||||
|
||||
view.BindingContext = vm;
|
||||
_lastViewModel = vm;
|
||||
Player player = (Player)ContentPage.FindByName("Player");
|
||||
player.PlayButtonCommand = new Command(vm.PlayExecute, vm.PlayCanExecute);
|
||||
player.NextButtonCommand = new Command(vm.NextExecute, vm.NextCanExecute);
|
||||
player.PreviousButtonCommand = new Command(vm.PreviousExecute, vm.PreviousCanExecute);
|
||||
vm.Media = this.Media;
|
||||
AssignPlayerControls(vm);
|
||||
vm.OnActive();
|
||||
|
||||
|
||||
ContentPresenter viewContent = (ContentPresenter)ContentPage.Content.FindByName("ViewContent");
|
||||
viewContent.Content = view;
|
||||
|
||||
MasterPage.ListView.SelectedItem = screenList.FirstOrDefault();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Unassign setplayer delegate to prevent vms from changing player info when inactive
|
||||
/// </summary>
|
||||
/// <param name="vm"></param>
|
||||
private void UnassignPlayerControls(BaseViewModel vm)
|
||||
{
|
||||
vm.SetPlayerMetadata = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Assign main views music player controls to a view model
|
||||
/// </summary>
|
||||
/// <param name="vm">BaseViewModel to assign controls to</param>
|
||||
private void AssignPlayerControls(BaseViewModel vm)
|
||||
{
|
||||
Player player = (Player)ContentPage.FindByName("Player");
|
||||
player.PlayButtonCommand = new Command(vm.OnPlayExecute, vm.CanPlayExecute);
|
||||
player.NextButtonCommand = new Command(vm.OnNextExecute, vm.CanNextExecute);
|
||||
player.PreviousButtonCommand = new Command(vm.OnPreviousExecute, vm.CanPreviousExecute);
|
||||
|
||||
//Assign SetPlayer delegate
|
||||
vm.SetPlayerMetadata = SetPlayerDelegate;
|
||||
}
|
||||
|
||||
private void SetPlayerDelegate(BaseMedia media)
|
||||
{
|
||||
Player player = (Player)ContentPage.FindByName("Player");
|
||||
if (media.Metadata is AudioMetadata)
|
||||
{
|
||||
AudioMetadata meta = (AudioMetadata)media.Metadata;
|
||||
player.ArtistName = meta.Artist;
|
||||
player.SongTitle = meta.Title;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6,7 +6,8 @@
|
||||
xmlns:mp="clr-namespace:Aurora.Design.Components.MediaPlayer"
|
||||
x:Class="Aurora.Design.Views.MainView.PageContainer">
|
||||
<ContentPage.Content>
|
||||
<Grid>
|
||||
<Grid
|
||||
x:Name="Grid">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition
|
||||
Height="*"/>
|
||||
|
Reference in New Issue
Block a user