当我点击Click Event处理程序时,Selection Changed Event正在上升

时间:2014-11-03 05:47:18

标签: windows-phone-8

对于这个愚蠢的问题感到抱歉。我甚至不明白该问题的标题应该是什么。

我有3个按钮,当我点击它们时,应该显示列表框。 如果我在列表框中选择一个项目,它应该被导航并开始播放。

当我点击一个按钮时,列表框正在显示,当一个项目被选中时,它将导航到其他页面并播放。如果我点击任何按钮后执行选择更改,我会收到错误

tori.dll

中出现'System.NullReferenceException'类型的第一次机会异常

tori.dll

中发生了未处理的“System.NullReferenceException”类型异常

Archieves .xaml:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,-951,0">
        <Button Name="btn1" Click="btn1_Click" Content="Daily" HorizontalAlignment="Left" Margin="0,88,0,0" VerticalAlignment="Top" Width="127" Height="72"/>
       <Button Name="btn2" Click="btn2_Click" Content="Weekly" HorizontalAlignment="Left" Margin="132,88,0,0" VerticalAlignment="Top" Height="72" Width="140"/>
      <Button Name="btn3" Click="btn3_Click" Content="CurrentMonth" HorizontalAlignment="Left" Margin="277,88,0,0" VerticalAlignment="Top" Height="72" Width="169"/>
                    <ListBox x:Name="itemsList" Margin="0,225,945,0"  
                SelectionChanged="itemsList_SelectionChanged">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Height="130">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Image delay:LowProfileImageLoader.UriSource="{Binding ThumbnailUrl}" 
                               Grid.Column="0" 
                               Width="500" 
                               Height="125" 
                               VerticalAlignment="Center" 
                               HorizontalAlignment="Center" 
                               Margin="6"/>
                        <StackPanel Margin="10,20,0,0"
                                    Grid.Column="1"
                                    Height="60"
                                    Orientation="Horizontal" 
                                    VerticalAlignment="Center">
                            <TextBlock Text="{Binding title}" 
                                       FontSize="40" />

                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
       </Grid>

Archieves.xaml.cs:

namespace tori
{
    public partial class Archieves : PhoneApplicationPage
    {
        public Archieves()
       {
            InitializeComponent();
       }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        WebClient downloader = new WebClient();
        Uri uri = new Uri(" http://www.toucheradio.com/RSSFeed/rssDaily.php ", UriKind.Absolute);
        downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(ChannelDownloaded);
        downloader.DownloadStringAsync(uri);
    }

    void ChannelDownloaded(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Result == null || e.Error != null)
        {
            MessageBox.Show("There was an error downloading the XML-file!");
        }


        else
        {
            // Deserialize if download succeeds

            XDocument document = XDocument.Parse(e.Result);

            var queue = from item in document.Descendants("item")
                        select new Item
                        {
                            title = item.Element("title").Value
                            ,
                            link = item.Element("link").Value
                            ,
                            pubDate = item.Element("pubDate").Value
                            ,
                            ThumbnailUrl = item.Element(item.GetNamespaceOfPrefix("media") + "thumbnail").Attribute("url").Value
                            ,

                        };

            itemsList.ItemsSource = queue;
        }
    }

private void btn2_Click(object sender, RoutedEventArgs e)
    {
        WebClient downloader = new WebClient();
        Uri uri = new Uri(" http://www.toucheradio.com/RSSFeed/rssWeekly.php ", UriKind.Absolute);
        downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Channel1Downloaded);
        downloader.DownloadStringAsync(uri);
    }

       void Channel1Downloaded(object sender, DownloadStringCompletedEventArgs e)
       {
           if (e.Result == null || e.Error != null)
           {
               MessageBox.Show("There was an error downloading the XML-file!");
           }
        else
        {
            // Deserialize if download succeeds

            XDocument document = XDocument.Parse(e.Result);

            var queue = from item in document.Descendants("item")
                        select new Item
                        {
                            title = item.Element("title").Value
                            ,
                            link = item.Element("link").Value
                            ,
                            pubDate = item.Element("pubDate").Value
                            ,
                            ThumbnailUrl = item.Element(item.GetNamespaceOfPrefix("media") + "thumbnail").Attribute("url").Value
                            ,

                        };

            itemsList.ItemsSource = queue;
        }
    }

private void btn3_Click(object sender, RoutedEventArgs e)
    {

        WebClient downloader = new WebClient();
        Uri uri = new Uri("http://www.toucheradio.com/RSSFeed/rssMonthly.php ", UriKind.Absolute);
        downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Channel2Downloaded);
        downloader.DownloadStringAsync(uri);
    }

    void Channel2Downloaded(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Result == null || e.Error != null)
        {
            MessageBox.Show("There was an error downloading the XML-file!");
        }
        else
        {
            // Deserialize if download succeeds

            XDocument document = XDocument.Parse(e.Result);

            var queue = from item in document.Descendants("item")
                        select new Item
                        {
                            title = item.Element("title").Value
                            ,
                            link = item.Element("link").Value
                            ,
                            pubDate = item.Element("pubDate").Value
                            ,

                            ThumbnailUrl = item.Element(item.GetNamespaceOfPrefix("media") + "thumbnail").Attribute("url").Value
                            ,

                        };

            itemsList.ItemsSource = queue;
        }
    }
    private void itemsList_SelectionChanged(Object sender, SelectionChangedEventArgs e)
    {
        var app = App.Current as App;
        app.selectedItem = (Item)itemsList.SelectedItem;
        this.NavigationService.Navigate(new Uri("/Details.xaml", UriKind.Relative));
    }

Item.cs:

namespace tori
{
         public class Item
    {
        public string title { get; set; }
        public string ThumbnailUrl { get; set; }
        public string link { get; set; }
        public string pubDate { get; set; }
    }
} 

Details.xaml:

 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Grid Height="617" VerticalAlignment="Top" Margin="-27,96,0,0">

            <Image x:Name="ThumbnailUrl" 

                               Width="279" 
                               Height="421" 
                               VerticalAlignment="Center" 
                               HorizontalAlignment="Center" 
                               Margin="0,-29,204,225" />
            <Image x:Name="Image1" Tap="Image1_Tap"  Margin="46,430,354,92" Source="/Images/pausebutton.png"/>
         <TextBlock x:Name="title" FontSize="30" TextWrapping="Wrap" Margin="284,57,-50,436"  />
                <TextBlock x:Name="pubDate" FontSize="25" Margin="284,186,10,363"  />
            <MediaElement x:Name="MediaElement1" AutoPlay="True"  Margin="0,397,20,0" Height="94" VerticalAlignment="Top" />   

Details.xaml.cs:

namespace tori
{
    public partial class Details : PhoneApplicationPage
    {
        Item item;

    public Details()
    {
        InitializeComponent();


         var app = App.Current as App;
       item = app.selectedItem;
       title.Text = item.title;
       pubDate.Text = item.pubDate;
        ThumbnailUrl.Source = new BitmapImage(new Uri(item.ThumbnailUrl, UriKind.RelativeOrAbsolute));
        string s = item.link;
        string url = s.Replace("archivesplayer", "hostArchivesURLForMobile");
        WebClient downloader = new WebClient();
        Uri uri = new Uri(url,UriKind.Absolute);
        downloader.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Channel3Downloaded);
        downloader.DownloadStringAsync(uri);
    }

    void Channel3Downloaded(object sender, DownloadStringCompletedEventArgs e)
    {
        var textData = (string)e.Result;
        Regex urlRegex = new Regex("<td height=\"25\" align=\"center\">(?<url>.*)</td>");
        MatchCollection mc = urlRegex.Matches(textData);
        string url = "";
        if (mc.Count > 0)
        {
            url = mc[0].Groups["url"].Value;
             MediaElement1.Source = new Uri(url, UriKind.Absolute);
             MediaElement1.Play();
        }
}
}
}

执行选择项目后如果单击某个按钮,我在此行中收到错误

title.Text = item.title;

任何人都可以告诉我如何克服这个空例外。当我点击一个按钮时,选择改变了事件而不是点击事件。我无法知道原因。

请有人帮帮我。

许多人提前感谢。

1 个答案:

答案 0 :(得分:1)

更改ItemsSource时,会引发SelectionChanged事件。我想每当你改变ItemsSource时,重置选择(即 - 设置为空(没有选中))。这应该是怎样的,否则ItemsSource中没有的项目可能是SelectedItem,这是错误的。

现在,要解决您的问题,只需在SelectedItem != null方法中检查是否itemsList_SelectionChanged

关于您的代码的其他信息:方法btn1_Clickbtn2_Clickbtn3_Click似乎只有微小的差异,因此您可以将大部分代码放在一个方法中并将其传递给它网址。这对于ChannelDownloaded方法来说更为重要(因为它们更长)。基本上你想尽可能多地重用代码。这使得代码更易于阅读(因为它不是10页,而是一个,可以这么说),并且更容易维护(如果出现错误 - 您只需要在一个地方修复它)