未动态添加堆栈面板子项

Stack panel child not being added dynamically

我犯了一些错误或警告但让我难过的事情。我的知识水平是新手,还请多多包涵

在编写一个小型 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);
            }));
        }

    }

以下是在 MainWindow 中调用的方法:

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;
}