UWP AutoSuggestionBox Search Utility, используя мою модель - PullRequest
0 голосов
/ 20 сентября 2018

Я сейчас работаю над проектом по созданию медиапроигрывателя с библиотекой. Я опубликую код для этого метода. Я пытаюсь добиться этого с помощью AutoSuggestionBox Для поиска в моей библиотеке GridView элементов, затем запрос одной из песен и выделение ее в GridView

Вот мой код для библиотеки

private ObservableCollection<MusicLib> MusicList = new ObservableCollection<MusicLib>();
private StackPanel CurrentTarget;
private string content;

public Browsing()
{

    this.InitializeComponent();


}

private async void btn_Add_Click(object sender, RoutedEventArgs e)
{


    //Create a new picker
    var filePicker = new Windows.Storage.Pickers.FileOpenPicker();

    //Add filetype filters. 

    filePicker.FileTypeFilter.Add(".mp3");
    filePicker.FileTypeFilter.Add(".wav");


    //Set picker start location to the video library
    filePicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;







    var files = await filePicker.PickMultipleFilesAsync();



    foreach (var file in files)
    {
        StorageItemThumbnail currentThumb = await file.GetThumbnailAsync(ThumbnailMode.MusicView, 200, ThumbnailOptions.UseCurrentScale);
        var albumCover = new BitmapImage();
        albumCover.SetSource(currentThumb);

        var musicProperties = await file.Properties.GetMusicPropertiesAsync();
        var musicname = musicProperties.Title;
        var musicdur = musicProperties.Duration;

        var artist = musicProperties.Artist;
        if (artist == "")
        {
            artist = "Unkown";
        }

        var album = musicProperties.Album;
        if (album == "")
        {
            album = "Unkown";
        }
        MusicList.Add(new MusicLib
        {
            FileName = musicname,
            Artist = artist,
            Album = album,
            Duration = musicdur,
            AlbumCover = albumCover,
            MusicPath = file.Path
        });

    }
}

Вот мое контекстное меню дляУдаление треков (это работа в процессе, я, вероятно, пропускаю что-то глупое)

private void ListView_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
    GridView listView = (GridView)sender;
    allContactsMenuFlyout.ShowAt(listView, e.GetPosition(listView));
    var a = ((FrameworkElement)e.OriginalSource).DataContext as MusicList;
    content = a.text;
}

private void Remove_Click(object sender, RoutedEventArgs e)
{
    foreach (var item in MusicList.ToList())
    {
        if (item.text == content)
        {
            MusicList.Remove(item);
        }
    }
    content = "";
}

Xaml

<Grid Background="White" Name="MyGrid">

            <AutoSuggestBox Name="Search" />
    <GridView RightTapped="ListView_RightTapped"  Name="mylist" ItemsSource="{x:Bind MusicList}" Margin="0,37,0,0">

        <GridView.ItemTemplate>
            <DataTemplate>

                <StackPanel>
                    <StackPanel  Name="Stacky" PointerEntered="myList_PointerEntered" Orientation="Horizontal">
                        <Image MaxWidth="100" MaxHeight="100" Source="{Binding AlbumCover}"/>
                    </StackPanel>
                    <StackPanel  >
                        <TextBlock Text="{Binding FileName}" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Artist}" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Album}" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Duration}" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding FileName}" />
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </GridView.ItemTemplate>
        <GridView.Resources>
            <MenuFlyout x:Name="allContactsMenuFlyout">
                <MenuFlyout.Items>
                    <MenuFlyoutItem x:Name="Edit"  Text="Edit" />
                    <MenuFlyoutItem x:Name="Remove" Text="Remove"    Click="Remove_Click" />
                </MenuFlyout.Items>
            </MenuFlyout>
        </GridView.Resources>
    </GridView>

Модель

namespace Mp3Player
{
    class MusicLib
    {
        public string FileName { get; set; }
        public string Artist { get; set; }
        public string Album { get; set; }
        public TimeSpan Duration { get; set; }
        public string MusicPath { get; set; }
        public BitmapImage AlbumCover { get; set; }
    }
}

Чтобы быть более конкретным в моем вопросе, я пытаюсь запросить один объект у моей Model , чтобы "найти" этот конкретный трек, например FileName Например

Я знаю, что с окном автоматического предложения есть 3 метода, которые вам необходимо использовать, один из которых - Запрос . Я просто в растерянности относительно того, что делать, если кто-то может предоставитьПример, возможно, я буду признателен, и опубликовать мой проектct на GitHub для будущего Ссылка для тех, кто новичок в этом, как я.

1 Ответ

0 голосов
/ 20 сентября 2018

AutoSuggestBox был задокументирован с деталями его конструкции и как использовать его вместе с примерами кода здесь .

Это типичный AutoSuggestBox

<AutoSuggestBox PlaceholderText="Search" QueryIcon="Find" Width="200"
            TextChanged="AutoSuggestBox_TextChanged"
            QuerySubmitted="AutoSuggestBox_QuerySubmitted"
            SuggestionChosen="AutoSuggestBox_SuggestionChosen"/>

Backend

private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
{
    // Only get results when it was a user typing,
    // otherwise assume the value got filled in by TextMemberPath
    // or the handler for SuggestionChosen.
    if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
    {
        //Set the ItemsSource to be your filtered dataset
        //sender.ItemsSource = dataset;// Here you will filter your music list and only send back the data which matches with the text in your autosuggest box.

    }
}


private void AutoSuggestBox_SuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
{
    // Set sender.Text. You can use args.SelectedItem to build your text string.
}


private void AutoSuggestBox_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
{
    if (args.ChosenSuggestion != null)
    {
        // User selected an item from the suggestion list, take an action on it here.
    }
    else
    {
        // Use args.QueryText to determine what to do.
    }
}

В вашем случае у вас есть коллекция объектов MusicLib , и вам нужно отфильтровать с помощью FileName , поэтому DataSet , который вы отправите обратно в виде отфильтрованных данных, будет из вашей коллекции.для этого вы можете использовать LINQ или просто простой цикл foreach, если вы предпочитаете это.

Обратите внимание, что когда вы продолжаете фильтровать свою коллекцию, но если вы изменяете коллекцию для фильтрации, вам нужно сохранятьвторая коллекция, в которой всегда будут все музыкальные треки, и как только вы освоитесь с основными понятиями, не стесняйтесь исследовать: AdvancedCollectionView by WindowsCommunityToolkit , что делает фильтрацию намного проще и мощнеедля вас.

GoodLuck

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...