【问题标题】:How to address a UI Element I created dynamically in my code?如何处理我在代码中动态创建的 UI 元素?
【发布时间】:2018-05-29 12:38:09
【问题描述】:

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

为了显示我收到的参数,我从我的代码隐藏文件中动态创建了一个网格。 (这已经在工作了。)

在我获得参数后,设备将向我发送一个带有 min 的列表。和最大。价值观。使用此列表作为参考,我创建了一个滑块、切换开关或文本框。

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),我还将从序列号列表中收到它设备可以发送给我。

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

这就是我创建文本框的方式:

        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 元素中的值。

我怎样才能做到这一点?

【问题讨论】:

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


    【解决方案1】:
    Binding binding = new Binding();
    binding.Path = new PropertyPath("Value");
    binding.Source = ParameterSlider; 
    BindingOperations.SetBinding(ParaValue, TextBlock.TextProperty, binding);
    

    现在您的 textbox.text 绑定到滑块的值并自动更新它。酷吗?

    【讨论】:

    • 谢谢 :) 成功了。我想我必须多看看绑定的东西。我用了一点,但我发现它开始相当复杂......
    【解决方案2】:

    在这里为动态创建的控件分配唯一的名称:

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

    您以后总是可以通过它的名称找到一个 UI 元素:

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

    【讨论】:

    • 也许我的问题有点混乱,或者我现在很困惑。我需要的是从“SliderX”获取值到“ValueX”的“Text”属性中。如果我正确理解您的代码,它会创建一个值为“Value129”的文本框吗?还是只是在寻找名为“Value129”的文本框?我对 C# 和 UWP 完全陌生,所以我还在学习:/
    【解决方案3】:

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

            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();
                }
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多