我可以用字符串引用WPF元素吗?

我希望能够通过字符串中的文本引用C#中的WPF元素。 像这样的东西:

SelectElementFromString("TestButton").Opacity = 1; 

我可以这样做吗?

你真的需要吗? 不知怎的,我怀疑它。 怎么样:

XAML:


  

码:


 _SomeControl.SomeMethod(); 

以这种方式使用字符串几乎总是一个坏主意,只能使你的代码变得脆弱(我说几乎是因为有一些正当的理由,它们并不常见)。 另外,为什么你的方法返回一个字符串?

编辑:根据您在此处的评论,我建议您只使用一个集合来迭代您的控件:

我会用它,但这是一个痛苦[blah0.Property = true; blah 1.Property = true …]我有什么解决方案可以解决这个问题

几乎每个初学程序员都希望这样做(包括我自己几年前)。 创建一组名为label0label1label2等的控件,然后在循环中访问它们,如下所示:

 for( int i = 0; i < numControls; ++i ) { Control c = GetControl( "label" + i ); } 

由于各种原因这很糟糕,(幸运的是)完全没必要。 将所有控件加载到List ,并根据需要迭代它们。

 private List _controls = new List(); private void InitControlList() { _controls.Add( someControl ); _controls.Add( someOtherControl ); // and so on. Now just iterate through the list // when you need to update or access the controls. } 

正如HB所说,我的回答有助于OP,但可能无法帮助未来搜索此论坛的人真正需要直接回答。 所以,这是Jon的答案的转贴(谢谢,如果我能= D,会给你更多的代表)

您可以使用FindName搜索FrameworkElement的子控件。 要设置控件的名称,请使用XAML中的Name或x:Name属性。

注意:如果使用x:Name,该控件也将作为FrameworkElement的代码隐藏字段提供,您将可以直接访问它。

您可以使用FindName搜索FrameworkElement的子控件。 要设置控件的Name ,请使用XAML中的Namex:Name属性。

注意:如果使用x:Name ,该控件也将作为FrameworkElement的代码隐藏字段提供,您将可以直接访问它。

FrameworkElement.FindName将引导您朝着正确的方向…… http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname.aspx

  string indx ="textbox1"; var txt= layout.FindName(indx); TextBox sometxt= txt as TextBox; sometxt.Opacity = 1; 

这可能有所帮助