shogouki's 技術系メモ

WindowsPhoneとか、WPFとか、Androidとかその辺の技術メモ

ボタンを配列で扱いたい

ボタンを配列で扱いたい!という話が#wp7dev_jpで出ていたので、ちょっと試してみた。

<toolkit:WrapPanel Name="wrapPanel1">
	<Button Content="Button"
			Height="71"
			Name="button1"
			Width="160"
			Click="button_Click" />
	<Button Content="Button"
			Height="71"
			Name="button2"
			Width="160"
			Click="button_Click" />

	<!-- あとButtonとかその他UIコンポーネント好きなだけ -->
</toolkit:WrapPanel>

みたいなWrapPanelがあったとして、そこからButtonを引っ張り出して配列で扱いたい!
という場合。

…Buttonを配列で扱う良い例が思いつかないので、例えばボタンを押したらある一連のボタンのラベルがindex番号にしたい場合、

private void button_Click(object sender, RoutedEventArgs e)
{
	// WrapPanelの中にある要素からButtonだけ抜き出す
	var buttons = wrapPanel1.Children.Where(x => 
	{
		return x is Button;
	});

	// foreachでContent書き換え
	int count = 0;
	foreach (Button item in buttons)
	{
		item.Content = count++;
	}
}

というようにできます。
まず、wrapPanel1内にある子要素から、Buttonだけ抽出し、それをforeachでループさせてます。

それだけといえば、それだけですが…。

WrapPanel内の特定のボタンを引っ張り出したい場合は、そのボタンに特定のプリフィックスつけて、名前でフィルタリングしてやればいいでしょう。

上記処理を実際に組み込むと、

ボタンをタップすると
f:id:shogouki3:20120428132824p:plain

ラベルが変わる
f:id:shogouki3:20120428132825p:plain

ようになります

/* こういう意味じゃなかった…? */