如何处理我在代码中动态创建的UI元素?

时间:2017-12-15 10:09:26

标签: c# xaml uwp windows-10-universal windows-10-iot-core

我目前正在一个项目中工作,我通过RS232发送参数。 我的程序将在Raspberry Pi上运行,并将使用Win10 IoT平台。

要显示我收到的参数,我会从代码隐藏文件中动态创建一个Grid。 (这已经有效了。)

获取参数后,设备将向我发送一个min的列表。最多值。使用此列表作为参考,我创建了一个滑块,toggleswitch或文本框。

if ((maximum - minimum) > 1)
        {
            Slider ParameterSlider = new Slider();

            ParameterSlider.Name = "Slider" + CountControls;
            ParameterSlider.Width = 200;
            ParameterSlider.ValueChanged += new RangeBaseValueChangedEventHandler(ParameterSlider1_ValueChanged);
            ParameterSlider.Minimum = minimum;
            ParameterSlider.Maximum = maximum;
            ParameterSlider.Value = 0;
            ParameterSlider.VerticalAlignment = VerticalAlignment.Center;
            ParameterSlider.HorizontalAlignment = HorizontalAlignment.Left;

            SettingsGrid.Children.Add(ParameterSlider);
            Grid.SetColumn(ParameterSlider, 2);
            Grid.SetRow(ParameterSlider, CountControls);
        }

“minimum”和“maximum”是我从串行设备获得的变量。

如您所见,我将滑块元素的名称设置为“Slider”,并将参数的位置添加为后面的数字。

“CountControls”是我用来以正确的顺序创建网格的变量。当我接收到串行输入时,它只会从0到100计数。

对于每个元素(Slider,Toogleswitch,TextBox),我创建一个TextBox,它显示元素当前具有的值,并添加一个单位描述(mm,m,kg,s),我也将从列表中获取序列设备可以发送给我。

到目前为止一切正常,但我在添加值框时遇到问题。 由于我动态创建元素的名称,我无法在我的代码中引用它们。

这就是我创建TextBox的方法:

        TextBlock ParaValue = new TextBlock();

        Thickness ValueMargin = ParaValue.Margin;
        ValueMargin.Left = 10;
        ValueMargin.Top = 5;


        ParaValue.Name = "Value" + CountControls;
        ParaValue.FontSize = 20;
        ParaValue.Text = String.Empty + UnitBlock.Units[CountControls];
        ParaValue.VerticalAlignment = VerticalAlignment.Top;
        ParaValue.Margin = ValueMargin;

        SettingsGrid.Children.Add(ParaValue);
        Grid.SetColumn(ParaValue, 3);
        Grid.SetRow(ParaValue, CountControls);

“ParaValue.Text”当前包含“String.Empty”,我希望将其替换为UI元素中的值。

我怎么可能实现这个目标?

3 个答案:

答案 0 :(得分:1)

Binding binding = new Binding();
binding.Path = new PropertyPath("Value");
binding.Source = ParameterSlider; 
BindingOperations.SetBinding(ParaValue, TextBlock.TextProperty, binding);

现在你的textbox.text绑定到滑块的值并自动更新它。凉爽?

答案 1 :(得分:0)

在此为动态创建的控件指定唯一名称:

ParameterSlider.Name = "Slider" + CountControls;
...
ParaValue.Name = "Value" + CountControls;

您随时可以按名称找到UI元素:

TextBlock dynamicallyCreatedTextBlock = SettingsGrid.FindName("Value129") as TextBlock;
dynamicallyCreatedTextBlock.Text = "Got it";

答案 2 :(得分:0)

对于动态创建的引用元素,您可以这样找到它:

        foreach (UIElement element in SettingsGrid.Children)
        {
            System.Diagnostics.Debug.WriteLine(element.GetType());
            if (element.GetType().Name is "Slider")
            {
                var elementNew = element as Slider;
                ParaValue.Text = elementNew.Value.ToString();
            }

        }