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="?"グリッド内に新しい要素を追加する にはどうすればよいですか?

EDITこれは、XAMLを文字列として取得する方法です

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

ここから、xmlStrforTextBlocksを でチェックする必要がありText=?ます。そのようなものがある場合はTextBlock、秒を追加する必要がありますTextBlock

4

1 に答える 1

0

基本的に、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 の代わりに指定した型) が追加されます。 ここに画像の説明を入力

于 2013-08-12T10:59:59.600 に答える