未动态添加堆栈面板子项
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;
}
我犯了一些错误或警告但让我难过的事情。我的知识水平是新手,还请多多包涵
在编写一个小型 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;
}