我在 C# WPF XAML 中制作 RSS 聚合器时遇到问题

问题描述 投票:0回答:1

我遇到了编译代码后出现错误的问题,该错误给了我以下错误: “元素“MainWindow”不包含“RssItemsListBox_MouseDoubleClick”的定义,并且未找到采用“MainWindow”类型的第一个参数的可用扩展方法“RssItemsListBox_MouseDoubleClick”(是否缺少 using 指令或集合引用?)。

我不明白他的意思,我该怎么办? :-(

恳请您的支持和帮助,预先感谢您并致以诚挚的问候! :-)

我尝试制作一个 RSS 聚合器

namespace Super_RSS
{
    internal class Class1
    {
        public string Title { get; set; }
        public string Link { get; set; }
    }
}
<Window x:Class="Super_RSS.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Super_RSS"
        mc:Ignorable="d"
        Title="News Rss" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TextBox x:Name="RssUrlTextBox" Grid.Row="0" Margin="10" Width="400" Height="25" Text="https://example.com/rss"/>
        <Button Content="Load RSS" Grid.Row="0" Margin="670,10,0,10" Width="100" Height="25" Click="LoadRssButton_Click" HorizontalAlignment="Left" d:LayoutOverrides="Width"/>
            <ListBox x:Name="RssItemsListBox" Grid.Row="1" Margin="10" DisplayMemberPath="Title" MouseDoubleClick="RssItemsListBox_MouseDoubleClick" />
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows;
using System.Xml.Linq;

namespace Super_RSS
{
    /// <summary>
    /// Logika interakcji dla klasy MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private List<string> items = new List<string>();

        public MainWindow()
        {
            InitializeComponent();
        }

        private async void LoadRssButton_Click(object sender, RoutedEventArgs e)
        {
            string rssUrl = RssUrlTextBox.Text;
            var rss = new RssReader();
            var items = await rss.Read(rssUrl);
            RssItemsListBox.ItemsSource = items;
        }

        private async Task<List<string>> LoadRss(string rssUrl)
        {
            try
            {
                using (HttpClient client = new HttpClient())
                {
                    string rssData = await client.GetStringAsync(rssUrl);
                    XDocument doc = XDocument.Parse(rssData);
                    foreach (var item in doc.Descendants("item"))
                    {
                        string title = item.Element("title")?.Value;
                        items.Add(title);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error loading RSS feed: " + ex.Message);
            }
            return items;
        }
    }
}

internal class RssReader
{
    private object SelectedItem;



    public object RssItemsListBox { get; private set; }

    internal async Task<IEnumerable<string>> Read(string rssUrl)
    {
        List<string> items = new List<string>();
        try
        {
            using (HttpClient client = new HttpClient())
            {
                string rssData = await client.GetStringAsync(rssUrl);
                XDocument doc = XDocument.Parse(rssData);
                foreach (var item in doc.Descendants("item"))
                {
                    string title = item.Element("title")?.Value;
                    items.Add(title);
                }
            }
        }
        catch (Exception)
        {
            // Handle exceptions
        }
        return items;
    }
    private void RssItemsListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (RssItemsListBox is System.Windows.Controls.ListBox listBox && listBox.SelectedItem is RssItem selectedItem)
        {
            System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
            {
                FileName = selectedItem.Link,
                UseShellExecute = true
            });
        }
    }
}
c# wpf xaml
1个回答
0
投票

你问:

给我以下错误的代码[...]我不明白他的意思...

当由于与 UI 交互而“发生某些事情”时,会触发类似

ListBox.MouseDoubleClickButton.Click

事件
。当在 xaml 中订阅事件时,如您所示,后面的代码(即您的 
MainWindow 类)中需要有一个相应的方法(handler
),您可以在其中指定您想要响应发生的情况.


...我该怎么办...

您可以通过在

MainWindow

 类中添加必要的处理程序来避免编译错误。您需要的是具有此签名的方法:

public partial class MainWindow : Window { . . . private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) { } }
添加此功能的更简单方法之一是右键单击 xaml 中的方法名称,然后在上下文菜单中选择 

转到定义

context menu in xaml

© www.soinside.com 2019 - 2024. All rights reserved.