我有一个xaml作为字符串。内容如下所示:
<Grid Canvas.Top="100">
<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>
如果有一个带有Text="?"
的TextBlock,那么我想在同一行的最后一列中添加一个额外的TextBlock或ComboBox。我应该用什么来查找Text="?"
以及如何在网格中添加新元素?
编辑这就是我将XAML作为字符串
的方法byte[] decryptedData = DecryptData(Result);
string xmlStr = CryptoHandler.Decompress(decryptedData, Result.Length);
从这里开始,我必须使用xmlStr
检查TextBlocks
的{{1}}。如果有这样的Text=?
,那么我必须添加第二个TextBlock
答案 0 :(得分:0)
基本上,您不能在运行时在Silverlight(或WPF)中直接使用XAML。您使用元素层次结构(相当于在HTML中使用DOM)。
所有控件都只是grid元素的子元素,并在其上设置了特定的Grid 附加属性(例如Grid.Row和Grid.Column)。
所以澄清你的各种问题:
Children
示例:假设您添加了一个加载事件并为您的网格目标命名:
<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):