首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ListView从PlayerFramework (windows应用程序)添加到播放器中?

如何将ListView从PlayerFramework (windows应用程序)添加到播放器中?
EN

Stack Overflow用户
提问于 2016-09-20 09:04:55
回答 1查看 49关注 0票数 0

我从PlayerFramework向播放器添加了一个按钮,当单击该按钮时,会出现一个ListView来选择视频质量。

但是,当用户单击ItemClicked中的项时,我不知道如何实现ListView事件来处理。有人能帮我吗?

我的代码:

Entertainment.xaml

代码语言:javascript
复制
<AppBarButton x:Name="QualityButton"
              Grid.Column="3"
              Width="30"
              Height="30"
              Margin="8,0,8,0"
              Icon="Setting"
              Style="{TemplateBinding TransportBarButtonStyle}"
              Visibility="Visible">
    <AppBarButton.Flyout>
        <Flyout>
            <ListView Name="listView"
                      IsItemClickEnabled="True"
                      ItemsSource="{Binding List}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding}" />
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Flyout>
    </AppBarButton.Flyout>
</AppBarButton>

CustomInteractiveViewModel.cs

代码语言:javascript
复制
public class CustomInteractiveViewModel : InteractiveViewModel
{
    public CustomInteractiveViewModel(List<string> list, MediaPlayer player)
        : base(player)
    {
        List = list;
    }

    public List<string> List { get; set; }

}

MainPage.cs

代码语言:javascript
复制
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        var list = new List<string> { "360p", "480p", "720p" };

        player.InteractiveViewModel = new CustomInteractiveViewModel(list, player);

        player.Source = new Uri(Video, UriKind.RelativeOrAbsolute);
    }

MainPage.xaml

代码语言:javascript
复制
<Page x:Class="testPlayer.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:local="using:testPlayer"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:mmppf="using:Microsoft.PlayerFramework"
      xmlns:webvtt="using:Microsoft.PlayerFramework.WebVTT"
      mc:Ignorable="d">

    <Page.Resources>

        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Themes/Entertainment.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <mmppf:MediaPlayer Name="player" />
    </Grid>
   </Page>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 11:11:14

它不支持绑定事件(如ItemClickResourceDictionary中的SelectionChanged ),一个简单的方法是在这个ResourceDictionary后面创建代码,但是为了维护MVVM模式的完整性,最好注册一个附加财产,并将事件绑定到这个附加属性。

您可以这样修改Entertainment.xaml中的代码:

代码语言:javascript
复制
<ResourceDictionary
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:controls="using:Microsoft.PlayerFramework.Controls"
  xmlns:local="using:Microsoft.PlayerFramework">

  ...
<AppBarButton x:Name="QualityButton" Grid.Column="3" Width="30" Height="30" Margin="8,0,8,0"
    Icon="Setting" Style="{TemplateBinding TransportBarButtonStyle}" Visibility="Visible">
    <AppBarButton.Flyout>
        <Flyout>
            <ListView Name="listView" IsItemClickEnabled="True" ItemsSource="{Binding List}" controls:CustomInteractiveViewModel.ItemClickCommand="{Binding ItemClickedCommand}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding}" />
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Flyout>
    </AppBarButton.Flyout>
</AppBarButton>
...
</ResourceDictionary>

以及CustomInteractiveViewModel.cs中的代码

代码语言:javascript
复制
public class CustomInteractiveViewModel : InteractiveViewModel
{
    public CustomInteractiveViewModel(List<string> list, MediaPlayer player, DelegateCommand<string> itemclickedcommand)
    : base(player)
    {
        List = list;
        ItemClickedCommand = itemclickedcommand;
    }

    public List<string> List { get; set; }

    public DelegateCommand<string> ItemClickedCommand { get; set; }

    public static DependencyProperty ItemClickCommandProperty =
            DependencyProperty.RegisterAttached("ItemClickCommand",
                typeof(ICommand),
                typeof(CustomInteractiveViewModel),
                new PropertyMetadata(null, OnItemClickCommandChanged));

    public static void SetItemClickCommand(DependencyObject target, ICommand value)
    {
        target.SetValue(ItemClickCommandProperty, value);
    }

    public static ICommand GetItemClickCommand(DependencyObject target)
    {
        return (ICommand)target.GetValue(ItemClickCommandProperty);
    }

    private static void OnItemClickCommandChanged(DependencyObject target,
        DependencyPropertyChangedEventArgs e)
    {
        var element = target as ListViewBase;
        if (element != null)
        {
            if ((e.NewValue != null) && (e.OldValue == null))
            {
                element.ItemClick += OnItemClick;
            }
            else if ((e.NewValue == null) && (e.OldValue != null))
            {
                element.ItemClick -= OnItemClick;
            }
        }
    }

    private static void OnItemClick(object sender, ItemClickEventArgs e)
    {
        GetItemClickCommand(sender as ListViewBase).Execute(e.ClickedItem);
    }
}

最后在你的MainPage.cs

代码语言:javascript
复制
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    var list = new List<string> { "360p", "480p", "720p" };
    var ItemClickedCommand = new DelegateCommand<string>(ItemClicked);
    player.InteractiveViewModel = new CustomInteractiveViewModel(list, player, ItemClickedCommand);
}

public void ItemClicked(string item)
{
    //TODO:
}

DelegateCommand<T>类如下所示:

代码语言:javascript
复制
public class DelegateCommand<T> : ICommand
{
    private readonly Action<T> _execute;
    private readonly Func<T, bool> _canExecute;

    public event EventHandler CanExecuteChanged;

    public DelegateCommand(Action<T> execute, Func<T, bool> canexecute = null)
    {
        if (execute == null)
            throw new ArgumentNullException(nameof(execute));
        _execute = execute;
        _canExecute = canexecute ?? (e => true);
    }

    public bool CanExecute(object p)
    {
        try { return _canExecute(ConvertParameterValue(p)); }
        catch { return false; }
    }

    public void Execute(object p)
    {
        if (!this.CanExecute(p))
            return;
        _execute(ConvertParameterValue(p));
    }

    private static T ConvertParameterValue(object parameter)
    {
        parameter = parameter is T ? parameter : Convert.ChangeType(parameter, typeof(T));
        return (T)parameter;
    }

    public void RaiseCanExecuteChanged()
    {
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39589923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档