将Click事件添加到动态创建的Xaml按钮

envsm3lx  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(122)

我目前正在编写一个函数,该函数根据从C#中的API调用接收到的JSON信息在XAML中创建按钮(在运行时)。
我目前有以下代码:

Button downloadButton = new Button();
downloadButton.Click += new RoutedEventHandler(DownloadContent);

但我得到以下错误:
非静态字段、方法或属性'Mainwindow.DownloadContent(object,RoutedEventArgs)'需要对象指涉
我尝试将其更改为downloadButton.Click += new RoutedEventHandler(this, DownloadContent);,但出现错误:
Keyword 'this' is not valid in a static property, static method, or static field initializer
以下是DownloadContent的外观,以供参考

private void DownloadContent(object sender, RoutedEventArgs e)
{
    WebClient webClient = new WebClient();
    webClient.DownloadFileAsync(new Uri("API-URL"), contentZip);
    webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(InstallContent);        
}

这就是我想要的按钮外观(跳过其他内容,如背景颜色等)

<Button Name="Downloadbutton" 
  Content="Download"
  Click="DownloadContent"
</Button>

我是否遗漏了一些东西,比如为什么我会出现此错误以及如何修复它?

编辑

Installcontent函数如下所示:

private void InstallContent(object sender, AsyncCompletedEventArgs e)
{
    ZipFile.ExtractToDirectory(contentZip, contentPath, true);
    File.Delete(contentZip);
    writeJsonData(DLCbuttonTag);
    Downloadbutton.Visibility = Visibility.Collapsed;
    Uninstallbutton.Visibility = Visibility.Visible;
}

创建按钮的函数:

public static void getContentList()
        {
        string jsonString = File.ReadAllText(@"C:\Users\stage\OneDrive\Documenten\ContentInfo.json")
        ContentList contentList = JsonConvert.DeserializeObject<ContentList>(jsonString);;

            for (int i = 0; i < contentList.Content.Count; i++)
            {
                    StackPanel dynamicStackPanel = new StackPanel();
                    dynamicStackPanel.Orientation = Orientation.Horizontal;
                    dynamicStackPanel.Background = Brushes.Transparent;
                    
                    Button downloadButton = new Button();
                    downloadButton.Click += new RoutedEventHandler(DownloadContent);
                    dynamicStackPanel.Children.Add(downloadButton);
            }
        }
up9lanfz

up9lanfz1#

问题是getContentList被声明为static。您尝试引用示例方法DownloadContent。请从getContentList中删除static以修复此错误。
错误的原因是静态方法无法存取执行严修成员。静态成员不是在特定执行严修的内容中执行,而是在型别本身的内容中执行。虽然在WPF的情况下,很可能没有您网页的其他执行严修,但理论上可能有许多。静态方法不知道要选取哪个执行严修,因此发生错误。
有关静态成员的详细信息,请参见此link
旁注:在C#中,方法通常以大写字母开头(Pascal大小写),而不管它们的访问修饰符是什么。2因此getContentList应该是GetContentList

相关问题