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
}
你有什么想法怎么做吗?或者这是不可能的,我必须使用许多嵌套循环来做到这一点?
感谢您的帮助! :)
由于您尚未在这种情况下实现 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));
}
}
}