您可以使用IsReadOnly
而不是IsEnabled
来实现您正在寻找的东西。此外,您可以轻松地在代码中设置点击事件处理程序。如上所述,我不确定是否需要在代码中设置处理程序才能使其正常工作;但是,它确实简化了事情。
这是详细信息。
在页面类的构造函数中(这里是MainPage
),调用 setup 函数:
public MainPage()
{
this.InitializeComponent();
// call the setup for the textboxes
SetupTextBoxes();
}
这是我们做魔术的地方 - 将此页面上的所有文本框设为只读并设置点击处理程序:
private void SetupTextBoxes()
{
var tbs = GetVisualChildren<TextBox>(this, true);
foreach (var tb in tbs)
{
tb.IsReadOnly = true;
tb.AddHandler(TappedEvent, new TappedEventHandler(tb_Tapped), true);
}
}
实用函数,用于获取T
传入父项的给定类型 () 的所有子项的列表。
private List<T> GetVisualChildren<T>(DependencyObject parent, bool recurse = true)
where T : DependencyObject
{
var children = new List<T>();
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i);
var child = v as T;
if (child == null && recurse)
{
var myChildren = GetVisualChildren<T>(v, recurse);
children.AddRange(myChildren);
}
if (child != null)
children.Add(child);
}
return children;
}
最后是事件处理程序。这会在点击时启用每个文本框。
private void tb_Tapped(object sender, TappedRoutedEventArgs e)
{
((TextBox)(sender)).IsReadOnly = false;
}