Как найти элемент управления, созданный codebehind, используя имя в WPF

В настоящее время я пытаюсь создать эмулятор MIPS с использованием WPF.

В панели управления стеком называется registerList; Я создал 32 панели стека (с именами от C0 до C31), каждая из которых содержит 2 текстовых блока (второй текстовый блок с именем от R0 до R31).

Сначала я правильно отображаю 32 регистра, содержащиеся в Procesor.RegisterBank.Registers[i], используя созданный мной метод displayRegisters().

Я сделал метод для обновления всех 32 значений вторых текстовых блоков значениями, содержащимися в классе с именем Procesor.RegisterBank.

Однако при попытке использовать этот метод страница GUI не будет отображаться при запуске проекта.

Я застрял на этом в течение нескольких часов и почти не рассматривал возможность создания панелей стека с помощью кода.

Спасибо

 public partial class MainWindow : Window
{
    MRA.MRA Procesor = new MRA.MRA();
    public MainWindow()
    {
        InitializeComponent();
        displayRegisters();
        Procesor.RegisterBank.registers[1] = 69;
        updateRegisters();
    }

    public void updateRegisters()
    {
        for (int i = 0; i < Procesor.RegisterBank.registers.Length; i++)
        {
            var register = (StackPanel)registerList.FindName("C"+i.ToString());
            var content = (TextBlock)register.FindName("R"+i.ToString());
            content.Text= Procesor.RegisterBank.registers[i].ToString();
        }
    }

    public void displayRegisters()
    {
        for (int i = 0; i < Procesor.RegisterBank.registers.Length; i++)
        {
            var register = new StackPanel { Orientation = Orientation.Horizontal, Background = Brushes.White, Margin = new Thickness(6, 6, 6, 6), MinHeight = 25, Name = "C" + i.ToString() };
            var registerName = new TextBlock { Text = "R"+i.ToString(), FontSize = 16, MinWidth = 30, Background = Brushes.DarkGray, Foreground = Brushes.White};
            var registerValue = new TextBlock { Text = Procesor.RegisterBank.registers[i].ToString(), FontSize = 16, MinWidth = 100, HorizontalAlignment = HorizontalAlignment.Right, Name="R"+i.ToString()};
            register.Children.Add(registerName);
            register.Children.Add(registerValue);
            registerList.Children.Add(register);
        }
    }
}

1 ответ

Решение

Вы должны использовать RegisterName (), чтобы вновь добавленные Control может быть частью NameScope родительского контроля.

Добавьте эти строки в конце в вашем displayRegister() метод:

NameScope.SetNameScope(register, new NameScope());register.RegisterName(registerValue.Name, registerValue);registerList.RegisterName(register.Name, register);

Другие вопросы по тегам