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;
}