【问题标题】:How to find control created by codebehind using name in WPF [closed]如何在WPF中使用名称查找由代码隐藏创建的控件[关闭]
【发布时间】:2017-02-02 14:06:33
【问题描述】:

我目前正在尝试使用 WPF 创建 MIPS 模拟器。

在名为 registerList 的堆栈面板控件中;我创建了 32 个堆栈面板(命名为 C0 到 C31),每个都包含 2 个文本块(第二个文本块名为 R0 到 R31)。

我最初使用我创建的 displayRegisters() 方法正确显示了 Procesor.RegisterBank.Registers[i] 中包含的 32 个寄存器。

我创建了一个方法,用名为 Procesor.RegisterBank 的类中包含的值更新第二个文本块的所有 32 个值。

但是,当尝试使用此方法时,我启动项目时不会显示 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);
        }
    }
}

【问题讨论】:

  • “几乎考虑不通过代码创建堆栈面板。”几乎。你几乎认为做对了,但这太容易了。我建议你要么使用winforms,要么正确使用WPF。尝试将 WPF 用作 winforms 以痛苦告终。

标签: c# asp.net wpf xaml findname


【解决方案1】:

您必须使用 RegisterName() ,以便新添加的 Control 可以成为父控件的 NameScope 的一部分。

displayRegister() 方法的末尾添加这些行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2011-12-28
    • 2012-04-22
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多