Код C # WPF Останавливается при создании панели стека - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь добавить функцию, к которой при добавлении новой пары ключ-значение в сетевой таблице добавляется новая панель стека с новыми данными.Однако при запуске кода с использованием точек останова код просто останавливается беззвучно, без сбоев или чего-либо еще, просто останавливается.Код останавливается прямо при создании объекта StackPanel.

public void ValueChanged(ITable source, string key, Value value, NotifyFlags flags)
    {
        switch (key)
        {
            case @"AUTON_OPTIONS":
                updateAutonOptions(value.GetStringArray());
                break;
            case @"POSITION_OPTIONS":
                updatePositionOptions(value.GetStringArray());
                break;
            case @"AUTON_FOUND":
                updateAutonFound(value.GetString());
                break;
            default:
                StackPanel formItem = null;
                RobotData.Dispatcher.Invoke(() => 
                {
                    formItem = (StackPanel)RobotData.FindName(key);
                });
                if(formItem == null)
                {
                    StackPanel stackPanel = new StackPanel
                    {
                        Name = key,
                        Orientation = Orientation.Horizontal
                    }; //new stackpanel for new data type

                    Label label = new Label
                    {
                        Content = key
                    }; //new label for key name
                    TextBox textBox = new TextBox
                    {
                        IsEnabled = false,
                        Text = value.GetString()
                    }; //new textbox for value data

                    stackPanel.Children.Add(label); //add label to new stackpanel
                    stackPanel.Children.Add(textBox); //add textbox to new stackpanel
                    RobotData.Dispatcher.Invoke(() =>
                    {
                        RobotData.Children.Add(stackPanel);//add new stackpanel to RobotData stackpanel (declared in xaml) 
                    });

                }
                else
                {
                    foreach(Object o in ((StackPanel)formItem).Children)
                    {
                        if(o is TextBox)
                        {
                            ((TextBox)o).Text = value.GetString();
                            break;
                        }
                    }
                }
                break;

        }
    }

1 Ответ

0 голосов
/ 13 февраля 2019

Я решил проблему благодаря помощи друга, а также двум вышеупомянутым комментаторам!Спасибо вам обоим!Вот код, который работает:

public void ValueChanged(ITable source, string key, Value value, NotifyFlags flags)
    {
        switch (key)
        {
            case @"AUTON_OPTIONS":
                updateAutonOptions(value.GetStringArray());
                break;
            case @"POSITION_OPTIONS":
                updatePositionOptions(value.GetStringArray());
                break;
            case @"AUTON_FOUND":
                updateAutonFound(value.GetString());
                break;
            default:
                //StackPanel formItem = null;
                RobotData.Dispatcher.Invoke(() =>
                {
                    var formItem = LogicalTreeHelper.FindLogicalNode(RobotData, key);
                    //});
                    if (formItem == null)
                    {

                        //Dispatcher.Invoke(() =>
                        //{
                        StackPanel stackPanel = new StackPanel
                        {
                            Name = key,
                            Orientation = Orientation.Horizontal
                        }; //new stackpanel for new data type

                        Label label = new Label
                        {
                            Content = key
                        }; //new label for key name
                        TextBox textBox = new TextBox
                        {
                            IsReadOnly = true,
                            Text = value.GetObjectValue().ToString()
                        }; //new textbox for value data

                        stackPanel.Children.Add(label); //add label to new stackpanel
                        stackPanel.Children.Add(textBox); //add textbox to new stackpanel
                        RobotData.Children.Add(stackPanel);//add new stackpanel to RobotData stackpanel (declared in xaml) 
                                                           //});

                    }

                   else
                   {
                       foreach(Object o in ((StackPanel)formItem).Children)
                       {
                           if(o is TextBox)
                           {
                               ((TextBox)o).Text = value.GetString();
                               break;
                           }
                       }
                   }
                });
                break;

        }
    }
...