基本的に、Silverlight (または WPF) で実行時に XAML を直接操作することはありません。要素階層を操作します (HTML で DOM を操作するのと同じです)。
すべてのコントロールは、特定の Grid添付プロパティ(Grid.Row および Grid.Column など) が設定された単純なグリッド要素の子です。
したがって、さまざまな質問を明確にするために:
- コントロールを見つけるには、グリッドの子を繰り返します
- コントロールのコンテンツ キャストをコントロール タイプに一致させ、Text プロパティをチェックするには
- 新しいコントロールを追加するには グリッドに追加します
Children
- グリッド内の位置を設定するには、添付プロパティ (Grid.Row & Grid.Column) を設定します。
例: load イベントを追加し、グリッド ターゲットに名前を付けるとします。
<Grid x:Name="TargetGrid" Canvas.Top="100" Loaded="Grid_Loaded">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock FontSize="12" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2">Alfa2</TextBlock>
<TextBlock Text="?" Grid.Column="1" Grid.Row="0" />
<TextBlock Grid.Column="2" Grid.Row="0" xml:space="preserve">15</TextBlock>
</Grid>
次に、ロード (または他のイベント) で、次のようなことができます。
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
// Index of last column
int lastColumn = TargetGrid.ColumnDefinitions.Count - 1;
// Iterate all child elements
foreach (UIElement uiElement in TargetGrid.Children.ToList())
{
// See if the element is a Textbox
TextBlock textBlock = uiElement as TextBlock;
if (textBlock != null)
{
// if the textbox contains "?"
if (textBlock.Text == "?")
{
// Get column of textbox
int row = (int)textBlock.GetValue(Grid.RowProperty);
// Add a new control in the last column (same row)
var newTextBox = new TextBox();
newTextBox.SetValue(Grid.RowProperty, row);
newTextBox.SetValue(Grid.ColumnProperty, lastColumn);
newTextBox.Text = string.Format("I am a new Textbox in row {0}, col {1}", row, lastColumn);
TargetGrid.Children.Add(newTextBox);
}
}
}
}
これにより、"?" を含む TextBlock を持つ行の最後の列に新しいコントロール (TextBox の代わりに指定した型) が追加されます。