0

我有一个 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>

如果有一个 TextBlock,Text="?"那么我想在同一行的最后一列中添加一个额外的 TextBlock 或 ComboBox。我应该使用什么来查找Text="?"以及如何在网格中添加新元素?

编辑这就是我将 XAML 作为字符串获取的方式

byte[] decryptedData = DecryptData(Result);
string xmlStr = CryptoHandler.Decompress(decryptedData, Result.Length);

从这里我必须检查xmlStrfor TextBlockswith Text=?。如果有这样的,TextBlock那么我必须添加第二个TextBlock

4

1 回答 1

0

基本上,您不会在 Silverlight(或 WPF)中在运行时直接使用 XAML。您使用元素层次结构(相当于使用 HTML 中的 DOM)。

您的所有控件都只是网格元素的子元素,并在其上设置了特定的网格附加属性(例如 Grid.Row 和 Grid.Column)。

因此,为了澄清您的各种问题:

  • 查找控件迭代网格的子项
  • 将控件内容转换为控件类型并检查 Text 属性
  • 添加新控件 将其添加到 Grid 的Children
  • 要设置网格中的位置,请设置附加属性(Grid.Row & Grid.Column)

示例:假设您添加一个加载事件并命名您的网格目标:

    <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): 在此处输入图像描述

于 2013-08-12T10:59:59.600 回答