2017-12-15 33 views
2

현재 RS232를 통해 매개 변수를받는 프로젝트에서 일하고 있습니다. 내 프로그램은 Raspberry Pi에서 실행되며 Win10 IoT 플랫폼을 사용합니다.UI 요소를 처리하는 방법 코드에서 동적으로 만들었습니까?

내가받는 매개 변수를 표시하려면 코드 숨김 파일에서 동적으로 격자를 만듭니다. (이미 작동 중입니다.)

매개 변수를 얻은 후에 장치는 나에게 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); 
     } 

"최소"및 "최대"는 직렬 장치에서 가져온 변수입니다.

위에서 볼 수 있듯이 슬라이더 요소의 이름을 "슬라이더"로 설정하고 매개 변수의 위치를 ​​그 뒤에 번호로 추가합니다.

"CountControls"는 올바른 순서로 그리드를 만드는 데 사용하는 변수입니다. 시리얼 입력을 받으면 0부터 100까지 카운트됩니다.

모든 요소 (Slider, Toogleswitch, 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 요소에서 내 값으로 대체 될이 원하는됩니다.

어떻게이 작업을 수행 할 수 있습니까? 여기

답변

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

지금 textbox.text입니다 슬라이더의 Value에 바인딩되고 자동으로 업데이트됩니다. 시원한? 동적으로 생성 된 요소를 참조하기위한

+0

고마워요. :) 그 속임수를했습니다. 나는 바인딩 물건에 좀 더보아야 할 것 같아요. 조금 사용했지만 시작하기가 다소 복잡하다는 것을 알았습니다. – Daniel

0

당신은 당신의 동적으로 생성 된 컨트롤에 고유 한 이름을 할당 :

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

당신은 항상 나중에 그 이름으로 UI 요소를 찾을 수 있습니다

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

어쩌면 내 질문에 조금 혼란이나 지금은 혼란 스러워요. 필요한 것은 "SliderX"에서 "ValueX"의 "Text"속성에 값을 가져 오는 것입니다. 귀하의 코드를 올바르게 이해하면 "Value129"값을 가진 텍스트 상자가 생성됩니까? 또는 "Value129"라는 텍스트 상자를 찾고 있습니까? 저는 아직 C#과 UWP에 익숙하여 아직 배우고 있습니다 :/ – Daniel

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

     }