未动态添加堆栈面板子项

本文关键字:堆栈 动态 添加 | 更新日期: 2023-09-27 18:31:42

我犯了什么东西,它不会带来错误或警告,但让我难倒。 我的知识水平是新手,所以请耐心等待。

在编写一个小型 WPF 应用程序以从 Twitch 获取数据时,我需要一个堆栈面板,该面板将用户控件动态添加为子控件,但在执行代码时堆栈面板中不会显示任何内容。

我认为问题可能是添加子线程的调用来自另一个线程,但是经过测试,即使在同一线程上,添加也不起作用。

以前从未在应用程序中使用过用户控件,所以我很好奇这是否是问题所在,但是经过近两天的尝试,我来到这里。 我知道这注定是一个简单的错误。 如果我的代码在这里难以阅读,请提前道歉 - 为变量和方法使用长描述性名称。

代码如下:

首先,该应用程序的艰苦工作是在单独的线程上完成的,如下所示:

Thread main_work_thread = new Thread(new ThreadStart(do_main_work));
main_work_thread.IsBackground = false;
main_work_thread.Start();

子项通过石英作业添加到面板中(触发器按预期工作):

 public virtual void Execute(IJobExecutionContext context)
    {
        List<twitch_api.Stream> online_streamers = App.twitch_interface.get_followed_channels_data().streams;
        foreach (twitch_api.Stream streamer in online_streamers)
        {
            // ...collect data

            // display data in window
            App.Current.Dispatcher.Invoke((Action)(() =>
            {
                ((MainWindow)App.Current.MainWindow).favourite_streamer_stack_clear();
                ((MainWindow)App.Current.MainWindow).add_streamer_to_favourite_stack(streamer_detail);
            }));
        }
    }

以下是在主窗口中调用的方法:

public void add_streamer_to_favourite_stack(favourite_streamer_list_item_data new_streamer)
    {
        favourite_streamer_stack.Children.Add(new favourite_streamer_list_item_control(new_streamer));
    }
    public void favourite_streamer_stack_clear()
    {
        favourite_streamer_stack.Children.Clear();
    }

这是我尝试添加的用户控件背后的代码:

 public partial class favourite_streamer_list_item_control : UserControl
{
   public favourite_streamer_list_item_data my_streamer_data { get; set; }
    public favourite_streamer_list_item_control()
    { 
        InitializeComponent();
    }
    public favourite_streamer_list_item_control(favourite_streamer_list_item_data new_streamer_data)
    {
        this.my_streamer_data = new_streamer_data;
    }
    private void favourite_streamer_stack_item_Loaded(object sender, RoutedEventArgs e)
    {
        // update controls with the data
        this.streamer_avatar.Source = my_streamer_data.streamer_logo_bitmap;
        this.textblock_streamer_name.Text = my_streamer_data.streamer_name;
        this.textblock_game.Text = my_streamer_data.stream_game;
        this.textblock_title.Text = my_streamer_data.stream_title;
    }
}

非常感谢您的时间。

未动态添加堆栈面板子项

您需要

在无参数构造函数中调用InitializeComponent();。如果没有此调用控制器,将不会呈现。

public favourite_streamer_list_item_control(favourite_streamer_list_item_data new_streamer_data)
{
    InitializeComponent();
    this.my_streamer_data = new_streamer_data;
}