堆栈面板子项未动态添加

时间:2016-01-25 13:33:38

标签: c# wpf multithreading user-controls stackpanel

我已经犯了一些不会带来错误或警告的东西,但让我感到难过。我的知识水平是新手,所以请耐心等待。

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

非常感谢你的时间。

1 个答案:

答案 0 :(得分:0)

您需要在无参数构造函数中调用InitializeComponent();。没有这个呼叫,控制器就不会被渲染。

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