XAML.访问网格中的每个文本块,名称作为变量

本文关键字:变量 文本 网格 访问 XAML | 更新日期: 2023-09-27 18:23:53

大家好:(我必须从代码隐藏中访问每个文本块中的参数。我不想直接通过每个元素的名称访问这么多元素,所以我想循环访问。我有包含这些文本块名称的表格。

这是使用变量作为其名称更改 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
}

你有什么想法怎么做吗?或者这是不可能的,我必须使用许多嵌套循环来做到这一点?

感谢您的帮助! :)

XAML.访问网格中的每个文本块,名称作为变量

由于您尚未在这种情况下实现 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;
}

对于 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>

您的视图模型.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));
        }
    }
}