Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未动态添加堆栈面板子级_C#_Wpf_Multithreading_User Controls_Stackpanel - Fatal编程技术网

C# 未动态添加堆栈面板子级

C# 未动态添加堆栈面板子级,c#,wpf,multithreading,user-controls,stackpanel,C#,Wpf,Multithreading,User Controls,Stackpanel,我犯了一些错误或警告,但却让我难堪的事情。我的知识水平是新手,请容忍我 在编写一个小的WPF应用程序来从Twitch获取数据时,我需要一个堆栈面板,可以动态地将用户控件添加为子控件,但在执行代码时,堆栈面板中没有显示任何内容 我认为问题可能是添加子线程的调用来自另一个线程,但是经过测试,即使在同一个线程上,添加也不起作用 我以前从未在应用程序中使用过用户控件,所以我很好奇这是否是问题所在,但经过近两天的努力,我终于来到了这里。我知道这肯定是个简单的错误。如果我的代码在这里很难阅读,请提前道歉-对

我犯了一些错误或警告,但却让我难堪的事情。我的知识水平是新手,请容忍我

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

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

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

代码如下:

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

Thread main_work_thread = new Thread(new ThreadStart(do_main_work));
main_work_thread.IsBackground = false;
main_work_thread.Start();
孩子们通过石英作业添加到面板中(触发器按预期工作):

下面是我试图添加的用户控件背后的代码:

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

也许问题出在stackpanel上。你的stackpanel可能是隐藏的还是没有任何尺寸的?嗨,Erik,谢谢你的回复。我更改了stackpanel的背景以检查这一点,我可以肯定地看到它,但它没有子项也在您的无参数构造函数中?@ParkerXL请在添加控件后尝试调用stackpanel更新布局方法。谢谢Ilan。问题原来是InitializeComponent()。我知道这会很简单(而且很愚蠢),谢谢你抽出时间。既然控件正在加载,那么由于线程问题,它将引发另一个错误(我无法用数据填充控件,因为它来自不同的线程)。然而,这完全是另一个问题(可能已经回答了)。您的
调度程序.Invoke似乎正常。可能是拖缆详细信息引起问题。
 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;
    }
}
public favourite_streamer_list_item_control(favourite_streamer_list_item_data new_streamer_data)
{
    InitializeComponent();
    this.my_streamer_data = new_streamer_data;
}