2014-09-20 29 views
0

大家好:)我必须从后面的代码中访问每个TextBlock中的参数。我不想直接通过名称为每个元素访问很多元素,所以我想循环执行它。我有那些TextBlocks名称的表格。XAML。以变​​量名称访问Grid中的每个TextBlock

这是任何选项使用变量作为其名称更改TextBlock参数?

比如我想做某事这样的:(伪代码;))

string[] names={"id1","id2","id3"} // etc. 
foreach(string x in names) 
// I want to change opacity in each TextBlock which name is in table 'names' 
{ 
    x.Opacity = 50;// x used like name of TextBlock from XAML 
} 

你有任何想法如何做到这一点?或者这是不可能的,我不得不使用许多嵌套循环来做到这一点?

感谢您的帮助! :)

+0

不要这样做。 1.学习MVVM。 2.向视图模型添加“不透明度”属性,将视图中文本块的不透明度绑定到属性,通过更改属性值来调整所有控件的不透明度。 – Athari 2014-09-20 12:11:11

+0

你想介绍给我还是给我写一个这样的例子?我会很感激。我只是XAML和C#的初学者。我认为它应该看起来像这样在xaml: '不透明度=“{绑定opValue}”'和在后面的代码:'公共字符串opValue(获得;私人设置;)' 不幸的是我不知道我是正确的,还是我应该做什么。 – Aneirin 2014-09-20 12:26:49

+0

你需要实现'INotifyPropertyChanged',设置'DataContext'等。只需谷歌的“WPF MVVM教程”或寻找特定的MVVM库,如Caliburn.Micro或MVVMLight的文档。 WPF旨在与MVVM协同工作,因此无论如何您迟早都必须了解WPF(WPF中的WinForms方式很痛苦)。 – Athari 2014-09-20 12:37:54

回答

1

既然你没有实现MVVM但这种情况下,你可以使用FindName()方法按名称找到控制:

string[] names={"id1","id2","id3"}; // etc. 
foreach(string x in names) 
{ 
    var txt = (TextBlock)FindName(x); 
    txt.Opacity = 50; 
} 

或者如果所有TextBlock小号驻留在同一个父容器,你可以使用LINQ更有效的方式做:

string[] names={"id1","id2","id3"}; 
var textblocks = parentContainer.Children 
           .OfType<TextBlock>() 
           .Where(t => names.Contains(t.Name)); 
foreach(TextBlock t in textblocks) 
{ 
    t.Opacity = 50; 
} 
+0

您还可以制作一个递归函数来获取所有元素,即使它们不是在相同的容器: '空隙SetOpacityForChildren(面板p) { \t的foreach(在p.children的UIElement元件) \t { \t \t如果(元件是面板)SetOpacityForChildren(p); \t \t else if(names.Contains(element.Name){opacity = 50;} \t} } – 2014-09-20 17:10:15

0

对于MVVM,你需要指定一个DataContext你的元素或它的父母之一:

MainPage.xaml中(注:我跳过没有所需例如所有的命名空间定义,但你会显然需要更多)

<phone:PhoneApplicationPage 
    xmlns:viewModel="clr-namespace:MyProject.ViewModel"> 
    <phone:PhoneApplicationPage.Resources> 
     <viewModel:YourViewModel x:Key="ViewModel"> 
    </phone:PhoneApplicationPage.Resources> 

    <Grid DataContext="{StaticResource ViewModel}"> 
     <Button Opacity={Binding opValue}> 
    </Grid> 
</phone:PhoneApplicationPage> 

YourViewModel.cs

namespace ViewModel 
{ 
    class YourViewModel : INotifyPropertyChanged 
    { 
     private float opacity = 1.0f; 
     public float opValue 
     { 
      get { return opacity; } 
      private set 
      { 
       opacity = value; 
       OnPropertyChanged("opValue"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
相关问题