【问题标题】:How do I Random all the items in the listbox?如何随机化列表框中的所有项目?
【发布时间】:2015-05-26 12:08:29
【问题描述】:

我不想随机数,我想随机化 C# XAML Windows Store App 列表框中的所有项目??

任何人都有代码或知道如何做到这一点?

我有这个列表框代码

<ListBox Name="Playlist" Background="White" DoubleTapped="Playlist_DoubleTapped" KeyUp="Playlist_KeyUp"
     Foreground="Black" SelectionMode="Single" SelectionChanged="Playlist_SelectionChanged"
     ScrollViewer.VerticalScrollMode="Enabled" 
     ScrollViewer.VerticalScrollBarVisibility="Auto" 
     Grid.Column="0" Margin="28,82,1067,32">

@Baldrick 这就是我将歌曲/视频添加到播放列表列表框的方式

public async void OpenFileButton_Click(object sender, RoutedEventArgs e)
{
    FileOpenPicker filePicker = new FileOpenPicker();
    filePicker.ViewMode = PickerViewMode.List;
    filePicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
    filePicker.CommitButtonText = "Play";
    foreach (string fileExtension in supportedAudioFormats)
    {
        filePicker.FileTypeFilter.Add(fileExtension);
    }
    foreach (string fileExtension in supportedVideoFormats)
    {
        filePicker.FileTypeFilter.Add(fileExtension);
    }

    IReadOnlyList<StorageFile> selectedFiles = await filePicker.PickMultipleFilesAsync();
    if (selectedFiles.Count > 0)
    {
        foreach (StorageFile file in selectedFiles)
        {
            Playlist.Items.Add(file);
        }
        systemMediaControls.IsEnabled = true;

        mediaSource.AutoPlay = true;
        await SetNewMediaItem(0);   // Start with first file in the list of picked files.
        StorageFile files = Playlist.SelectedItem as StorageFile;
        Thumbnail(files);
    }
}

【问题讨论】:

  • 什么函数或事件会触发列表框项目的随机化?
  • Click="Button_Click" 将是随机化列表框中所有项目的按钮
  • 您最好将ItemsSource 属性绑定到视图模型中的后备列表(例如 ObservableCollection),然后在绑定列表上使用 Fischer-Yates shuffle。这更简洁,并且可以让您不必弄乱 ListBox 中的项目。
  • 能贴出Button_Click事件触发的函数吗?
  • @Nathan 好吧,我目前正在使用音乐播放器应用程序..我可以随机选择索引..但我想随机选择整个列表..请告诉我如何做 public void Button_Click (对象发送者,RoutedEventArgs e) { Rand(); } public void Rand() { Playlist.SelectedIndex = rnd.Next(Playlist.Items.Count - 1); }

标签: c# xaml random listbox windows-store-apps


【解决方案1】:

这是一个例子。

XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <ListBox Grid.Row="0" Name="Playlist" ItemsSource="{Binding Path=PlaylistItems}"/>
    <Button Grid.Row="1" Name="Shuffle" Content="Shuffle" Click="Shuffle_Click"/>
</Grid>

请注意,PlaylistItems 绑定到 ListBox。最好是操纵绑定到ListBox 的项目集合,而不是操纵ListBox 本身。

C#代码:

首先,您应该定义 PlaylistItems 集合。

public ObservableCollection<string> PlaylistItems
{
    get;
    set;
}

为了能够将其绑定到ListBox,有必要设置您的控件(窗口或其他)的DataContext

public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;  // <--
}

现在让我们初始化PlaylistItems 集合并添加一些项目。

public void InitializeItems(int count)
{
    var items = new List<string>(count);

    for (int i = 0; i < count; i++)
        items.Add("Item " + i);

    PlaylistItems = new ObservableCollection<string>(items);
}

你可以在构造函数中调用这个方法。

public MainWindow()
{
    InitializeComponent();
    this.DataContext = this;
    InitializePlaylist(10); // <--
}

最后是随机播放功能。

public IEnumerable<string> ShuffleItems(IEnumerable<string> items)
{
    var rnd = new Random();
    return items.OrderBy(item => rnd.Next()).ToList();
}

在您的按钮处理程序中使用它来用随机项目重新填充PlaylistItems

private void Shuffle_Click(object sender, RoutedEventArgs e)
{
    var shuffledItems = ShuffleItems(PlaylistItems);

    PlaylistItems.Clear();

    foreach (var item in shuffledItems)
        PlaylistItems.Add(item);
}

【讨论】:

  • 哇..现在列表正在改组..自从过去 2 天以来,我无法做这件小事..非常感谢@Anton Kedrov 感谢您帮助我 :)
  • 好的,现在我可以随机播放列表,但现在如何随机播放存储文件列表(例如歌曲列表)???
  • 此代码适用于任何类型的项目。只需将ObservableCollection&lt;string&gt; PlaylistItems 替换为ObservableCollection&lt;StorageFile&gt; PlaylistItems,将public IEnumerable&lt;string&gt; ShuffleItems(IEnumerable&lt;string&gt; items) 替换为public IEnumerable&lt;StorageFile&gt; ShuffleItems(IEnumerable&lt;StorageFile&gt; items),等等。
  • 您需要相应地修改您的ListBox。您需要添加ItemTemplate。例如:&lt;ListBox Grid.Row="0" Name="Playlist" ItemsSource="{Binding Path=PlaylistItems}"&gt;&lt;ListBox.ItemTemplate&gt;&lt;DataTemplate&gt;&lt;TextBlock Text="{Binding Path=SOME_TEXT_PROPERTY_OF_StorageFile}"/&gt;&lt;/DataTemplate&gt;&lt;/ListBox.ItemTemplate&gt;&lt;/ListBox&gt;
  • 如果您正在绑定StorageFile 项目,那么它将是StorageFile 的属性之一。喜欢NamePathDisplayName
猜你喜欢
  • 1970-01-01
  • 2011-01-02
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多