2017-06-14 41 views
-1

我需要你的帮助,我不擅长编程,现在我试着创建一个简单的音乐播放器,我希望它可以随机选择一首歌曲,当人们没有从列表框中选择歌曲时,以下是我的代码,但它不起作用。uwp c#随机选择

private void playMusic_Click(object sender, RoutedEventArgs e) 
{ 


    if (MylistBox.SelectedItem==null) 
    { 
     string[] songname = {"item1","item2","item3","item4"}; 
     MylistBox.SelectedItem = songname[new Random().Next(0,songname.Length)]; 
     if (MylistBox.SelectedItem == item1) 
     { 
      mediaElement_music.Source = new Uri("ms-appx:///Assets/24K Magic.mp3"); 

     } 
     else if (MylistBox.SelectedItem == item2) 
     { 
      mediaElement_music.Source = new Uri("ms-appx:///Assets/Summer Air.mp3"); 

     } 
     else if (MylistBox.SelectedItem == item3) 
     { 
      mediaElement_music.Source = new Uri("ms-appx:///Assets/Vampire.mp3"); 

     } 
     else if (MylistBox.SelectedItem == item4) 
     { 
      mediaElement_music.Source = new Uri("ms-appx:///Assets/Happy.mp3"); 
     } 
    } 
    if (MylistBox.SelectedItem == item1) 
    { 
     mediaElement_music.Source = new Uri("ms-appx:///Assets/24K Magic.mp3"); 

    } 
    else if (MylistBox.SelectedItem == item2) 
    { 
     mediaElement_music.Source = new Uri("ms-appx:///Assets/Summer Air.mp3"); 

    } 
    else if (MylistBox.SelectedItem == item3) 
    { 
     mediaElement_music.Source = new Uri("ms-appx:///Assets/Vampire.mp3"); 

    } 
    else if (MylistBox.SelectedItem == item4) 
    { 
     mediaElement_music.Source = new Uri("ms-appx:///Assets/Happy.mp3"); 
    } 

} 
+1

数组''songname'是一个字符串数组。但是,您会将'Mylistbox.SelectedItem'与对象而不是字符串进行比较。这是否工作:'MylistBox.SelectedItem ==“item1”'? 因为你的长度是4,但是索引是基于0的,所以还要把'new Random()。Next(0,songname.Length)'改为'new Random()。Next(0,songname.Length -1)因此对象4不存在 – user2657943

+1

您可能还想将歌曲放入数组中 - 如果您将音乐网址存储为字符串[],您可以随意选取一个或使用ComboBox的SelectedIndex选项。这将摆脱所有'如果'''else'块。 –

+1

@ user2657943随机调用是正确的,它是*独占*上限。 –

回答

1

你的代码有几个问题。我试图在下面的例子中解决它们。让我知道,如果它的工作原理:

首先,创建具有下列属性的名称和来源的简单类

public class Song 
{ 
    public string Name { get; set; } 
    public Uri Source { get; get; } 
} 

方法然后改成这样:

private void playMusic_Click(object sender, RoutedEventArgs e) 
{ 


    if (MylistBox.SelectedItem==null) 
    { 
     Song[] songname = 
     { 
      new Song 
      { 
       Name = "item1", 
       Source = new Uri("ms-appx:///Assets/24K Magic.mp3") 
      }, 
      new Song 
      { 
       Name = "item2", 
       Source = new Uri("ms-appx:///Assets/Summer Air.mp3") 
      }, 
      new Song 
      { 
       Name = "item3", 
       Source = new Uri("ms-appx:///Assets/Vampire.mp3") 
      }, 
      new Song 
      { 
       Name = "item4", 
       Source = new Uri("ms-appx:///Assets/Happy.mp3") 
      } 
     }; 
     MylistBox.SelectedItem = songname[new Random().Next(0,songname.Length)]; 
    } 
    mediaElement_music.Source = ((Song)MylistBox.SelectedItem).Source; 
} 

这是更清洁,因为它消除你所有的如果 - 其他的

+0

对不起,它不起作用,它显示:System.NullReferenceException:'对象引用未设置为对象的实例。' () – WANGJAY

+0

@WANGJAY - 可能因为你有一些代码赋予'mediaElement_music.Source'除了'null'或者'Song'实例。 – Enigmativity

+0

@WANGJAY你会在哪一行发现错误? – user2657943

0

您的代码的问题是MylistBox.SelectedItemobject类型,所以==运算符默认为refe这意味着即使MylistBox.SelectedItem的值与您与==进行比较的项目的值相同,也将是false,除非它们是相同的参考。

看看这个代码:

object x = String.Join("", new [] { "fo", "o" }); 
string y = "foo"; 
Console.WriteLine(x); 
Console.WriteLine(y); 
Console.WriteLine(x == y); 

它输出:

 
foo 
foo 
False 

为了得到它的工作,我需要这样做:

Console.WriteLine((string)x == y); 

则输出True

==的使用仅在您知道对左手操作数的编译类型正确定义时才有效。

现在,如果您使用了.Equals(...),那么正确的运行时间超载就会起作用。所以你需要做if ((string)MylistBox.SelectedItem == item1)if (MylistBox.SelectedItem.Equals(item1))


无论如何,你的代码效率很低。试试这个:

private Dictionary<string, string> _songs = new Dictionary<string, string>() 
{ 
    { "item1", "24K Magic" }, 
    { "item2", "Summer Air" }, 
    { "item3", "Vampire" }, 
    { "item4", "Happy" }, 
}; 

private Random _random = new Random(); 

private void playMusic_Click(object sender, RoutedEventArgs e) 
{ 
    if (MylistBox.SelectedItem == null) 
    { 
     MylistBox.SelectedItem = _songs.ElementAt(_random.Next(0, _songs.Count())).Key; 
    } 
    mediaElement_music.Source = new Uri(String.Format(
     "ms-appx:///Assets/{0}.mp3", 
     _songs[(string)MylistBox.SelectedItem])); 
}