如何在 WPF 中使用名称查找代码隐藏创建的控件
How to find control created by codebehind using name in WPF
我目前正在尝试使用 WPF 创建 MIPS 仿真器。
在名为 registerList 的堆栈面板控件中;我创建了 32 个堆栈面板(名为 C0 到 C31),每个面板包含 2 个文本块(第二个文本块名为 R0 到 R31)。
我最初使用我创建的 displayRegisters() 方法正确显示 Procesor.RegisterBank.Registers[i] 中包含的 32 个寄存器.
我创建了一个方法,用 class 中包含的值更新第二个文本块的所有 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);
}
}
}
你必须使用 RegisterName() ,这样新添加的 Control
可以成为父控件 NameScope
的一部分。
在您的 displayRegister()
方法的末尾添加这些行:
NameScope.SetNameScope(register, new NameScope());
register.RegisterName(registerValue.Name, registerValue);
registerList.RegisterName(register.Name, register);
我目前正在尝试使用 WPF 创建 MIPS 仿真器。
在名为 registerList 的堆栈面板控件中;我创建了 32 个堆栈面板(名为 C0 到 C31),每个面板包含 2 个文本块(第二个文本块名为 R0 到 R31)。
我最初使用我创建的 displayRegisters() 方法正确显示 Procesor.RegisterBank.Registers[i] 中包含的 32 个寄存器.
我创建了一个方法,用 class 中包含的值更新第二个文本块的所有 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);
}
}
}
你必须使用 RegisterName() ,这样新添加的 Control
可以成为父控件 NameScope
的一部分。
在您的 displayRegister()
方法的末尾添加这些行:
NameScope.SetNameScope(register, new NameScope());
register.RegisterName(registerValue.Name, registerValue);
registerList.RegisterName(register.Name, register);