0

起初我想说我在互联网上搜索并没有找到任何东西。我想制作一个动态歌曲列表,当用户添加歌曲时,将添加带有名称和长度的新对象,当他选择这首歌时,他将获得所选歌曲的路径。这是更好理解的代码:

XAML:

<Window x:Class="ListBox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ListBox x:Name="SongList" HorizontalAlignment="Left" Height="278" Margin="10,10,0,0" VerticalAlignment="Top" Width="248"/>
    <TextBlock HorizontalAlignment="Left" Margin="287,124,0,0" TextWrapping="Wrap" Text="Path" VerticalAlignment="Top" Width="194" Height="22"/>
    <Label Content="Song Path" HorizontalAlignment="Left" Margin="287,98,0,0" VerticalAlignment="Top" Width="194"/>
    <Button Content="Add Song" HorizontalAlignment="Left" Margin="10,293,0,0" VerticalAlignment="Top" Width="132" Click="Button_Click"/>

</Grid>

和代码:

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ListBox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openfile = new OpenFileDialog();
            openfile.DefaultExt = ".mp3";
            openfile.Filter = "mp3 | *.mp3";
            Nullable<bool> result = openfile.ShowDialog();
            if (result == true)
            {
                String file = openfile.FileName;
                FileInfo fileinfo = new FileInfo(file);

                SongList.Items.Add(fileinfo.Name);
            }
        }
    }
}

所以“路径”文本框在哪里,我想获取当前选定的歌曲路径。是否可以使用 ItemBox 制作或者我需要制作可以保存所有路径的数组?

4

4 回答 4

1

首先你可能想看看 MVVM 编程。这个概念不是那么容易理解,甚至更难应用,但是一旦你掌握了它,你将能够立即创建好的 UI,它特别适合你正在尝试做的事情。

现在到你的问题。FileInfo.Name 只存储文件名而不是路径,因此如果您不单独存储路径,您将无法仅从文件名中获取它。

KillaKem 的解决方案似乎相当不错,但是我不建议为此使用 Tag 属性。只需创建一个 Collections::Generic::List(请不要使用数组)类成员来存储路径,然后使用 selectedIndexChange 事件来更新 PathSearchBox。

使用 MVVM,您可以将 ListBox 链接到存储路径和文件名的字典并仅显示文件名,您可以自己研究一下 MVVM。

问候, 赛瑟

于 2013-11-10T18:24:12.537 回答
1

我认为您应该将其用于您的歌曲,因为您正在编写一个 WPF 应用程序,即您的歌曲对象的ObservableCollection,以便拥有一个包含更新对象的正确 ListBox。

然后,您必须创建一个Song具有自己属性的适当类,例如SongNameSongPath。在此类中,您将实现INotifyPropertyChanged接口,并且对于每个属性,您将引发适当的OnPropertyChanged事件。

使用此实现,一旦您加载一首歌曲并将其添加到歌曲列表中,您的 ListBox 将相应地显示更新的收藏。

有关 ObservableCollection 的更多信息在这里

如果您想查看代码示例,在这个答案中,我编写了一个开发 ObservableCollection 的示例。

于 2013-11-11T11:18:48.987 回答
0

你可以尝试一些类似的东西,

XAML:

<Window x:Class="ListBox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ListBox x:Name="SongList" HorizontalAlignment="Left" Height="278" Margin="10,10,0,0" VerticalAlignment="Top" Width="248"/>
    <TextBlock HorizontalAlignment="Left" Margin="287,124,0,0" TextWrapping="Wrap" Text="Path" VerticalAlignment="Top" Width="194" Height="22"/>
    <Label Name ="pathLabel" Content="Song Path" HorizontalAlignment="Left" Margin="287,98,0,0" VerticalAlignment="Top" Width="194"/>
    <Button Content="Add Song" HorizontalAlignment="Left" Margin="10,293,0,0" VerticalAlignment="Top" Width="132" Click="Button_Click"/>

</Grid>

返回代码:

namespace ListBox
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openfile = new OpenFileDialog();
            openfile.DefaultExt = ".mp3";
            openfile.Filter = "mp3 | *.mp3";
            Nullable<bool> result = openfile.ShowDialog();
            if (result == true)
            {
                String file = openfile.FileName;
                FileInfo fileinfo = new FileInfo(file);

                SongList.Items.Add(fileinfo.Name);

                var pathList = SongList.Tag as List<string>;
                pathList.Add(fileinfo.DirectoryName);
                SongList.Tag = pathList;
            }
        }

         private void Selection_Changed(object sender, EventArgs e)
        {
              var myListBox = sender as ListBox;
              var myPathList = myListBox.Tag as List<string>;
              var filePath = myPathList[myListBox.SelectedIndex];

              pathLabel.Content = filePath;
        }
    }
}

尚未测试代码,但它应该可以工作或接近工作。

于 2013-11-10T17:52:23.580 回答
-1

这些是您可以使用的列表框中的 SelectionChanged 事件。但我建议使用 bi

于 2013-11-10T17:04:19.077 回答