如何在Silverlight网格的最后一列中动态添加额外的TextBlock或ComboBox?

时间:2013-08-08 14:55:50

标签: c# silverlight xaml

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

1 个答案:

答案 0 :(得分:0)

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

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

所以澄清你的各种问题:

  • 查找控件迭代网格的子项
  • 将控制内容强制转换为控件类型并检查Text属性
  • 添加新控件将其添加到网格的Children
  • 要在网格中设置位置,请设置附加属性(Grid.Row&amp; 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): enter image description here