0

ここに画像の説明を入力

PlayerFramework からプレーヤーにボタンを追加しました。そのボタンをクリックすると、ビデオ品質を選択するための ListView が表示されます。
しかし、ユーザーが ListView でアイテムをクリックしたときに処理する ItemClicked イベントを実装する方法がわかりません。誰でも私を助けることができますか?

私のコード:

エンターテイメント.xaml

<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

public class CustomInteractiveViewModel : InteractiveViewModel
{
    public CustomInteractiveViewModel(List<string> list, MediaPlayer player)
        : base(player)
    {
        List = list;
    }

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

}

MainPage.cs

    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

<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>
4

1 に答える 1

1

ItemClickまたはSelectionChangedのようなイベントのバインドはサポートされていませんResourceDictionary。簡単な方法は、 this の背後にあるコードを作成することですResourceDictionaryが、MVVM パターンの整合性を維持するには、Attached プロパティを登録し、イベントをこの添付プロパティにバインドすることをお勧めします。

Entertainment.xaml次のようにコードを変更できます。

<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:

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

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>クラスは次のようになります。

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);
    }
}
于 2016-09-21T11:11:14.857 に答える