Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Silverlight网格的最后一列中动态添加额外的文本块或组合框?_C#_Silverlight_Xaml - Fatal编程技术网

C# 如何在Silverlight网格的最后一列中动态添加额外的文本块或组合框?

C# 如何在Silverlight网格的最后一列中动态添加额外的文本块或组合框?,c#,silverlight,xaml,C#,Silverlight,Xaml,我有一个xaml作为字符串。内容如下所示: <Grid Canvas.Top="100"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefini

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

                }
            }
        }
    }

从这里,我必须用
Text=?
检查
xmlStr
中的
TextBlocks
。如果存在这样一个
TextBlock
,那么我必须添加第二个
TextBlock
,基本上,您在Silverlight(或WPF)中运行时不会直接使用XAML。使用元素层次结构(相当于在HTML中使用DOM)

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

为了澄清你的各种问题:

  • 要查找控件,请迭代网格的子级
  • 将控件内容强制转换与控件类型匹配并检查Text属性
  • 要添加新控件,请将其添加到网格的
    子控件中
  • 要设置网格中的位置,请设置附着的属性(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>
这将在具有包含“”的TextBlock的任何行的最后一列中添加一个新控件(无论指定何种类型而不是TextBox):

您是否可以在XAML中添加文本块,并在必要时将其可见性从折叠更改为可见?我只能通过字符串访问XAML。在“代码隐藏”中,我解码一个文件并接收包含xaml的字符串。如果网格包含
而不是该行,我必须添加一个文本块。没有机会直接更改xaml。您可以编辑xaml吗?例如,添加一个DataTrigger where in when Text=“?”,然后可以切换其他对象(TextBlock)的可见性?更改XAML后会发生什么?您问了错误的问题。你的问题应该是“如何在Silverlight网格的最后一列中动态添加额外的文本块或组合框?答案可能根本不涉及Xaml。假设Xaml本身是静态的;您无法在运行时对其进行更改。XAML保存在数据库中时,不带
x:Name
用于
Grid
,也不带
load events
。如果我读了它们,就会得到一个没有这些属性的XAML。@Georg:你为什么要直接加载XAML?您始终可以在可视化树中导航并动态地查找元素(例如,按类型),但首先加载原始XAML似乎是在做一些“奇怪”的事情。我必须直接加载XAML,因为其他人将XAML添加到目录中,然后我必须加载它们。@Georg:这是一种动态表单创建吗?你能解释一下为什么XAML文件被添加到一个手动加载的目录中,而不是添加到项目中吗?您的工具是设计用于修改项目的源XAML还是在运行时?“@”HiTech Magic:是的,它是动态的。我不知道XAML的内容,我必须在运行时进行修改。我有一个FileWatcher,它检查是否添加了新文件,然后调用一个方法检查XAML的内容,如果发现带有“?”的TextBlocj,则进行修改
    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);

                }
            }
        }
    }