WPF: Как мне обратиться к пользовательскому контролю, который я установил во время выполнения?
Я добавил usercontrol в свой проект следующим образом:
Public Sub clickAutoDrillLeft(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)
Dim LSliderItem as New TriplexAmpsControl
me.LeftSlider.Items.Add(LSliderItem)
End sub
Объект "LSliderIn" - это элемент управления, а "TriplexAmpsControl" - это пользовательский элемент управления, имеющий три свойства только для записи, объявленные как целые числа с именами "AmpsPhaseA", "AmpsPhaseB" и "AmpsPhaseC".
Если я создаю экземпляр элемента управления во время выполнения, как указано выше, я могу сразу назначить значение одному из свойств, например:
Public Sub clickAutoDrillLeft(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)
Dim LSliderItem as New TriplexAmpsControl
me.LeftSlider.Items.Add(LSliderItem)
LSliderItem.AmpsPhaseA = 50
End sub
Но только в рамках подпрограммы. Я не знаю, как ссылаться на значения элемента управления в другом месте формы, потому что, если я пытаюсь вызвать элемент управления по его имени из какого-либо другого подпрограммы, компилятор, естественно, говорит мне, что элемент управления не является частью проекта, потому что он еще не был создан.
Все, что я смог найти по этому вопросу, касается создания элементов управления в программном коде, но отмечается, как подключаться к пользовательским элементам управления, как я это делал.
1 ответ
(Превентивное примечание: извините мой VB - я кодер C#:)
Вам необходимо создать переменную уровня модуля:
Dim _lSliderItem as TriplexAmpsControl
тогда в вашем коде где-то:
Public Sub clickAutoDrillLeft(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs)
_lSliderItem = New TriplexAmpsControl
me.LeftSlider.Items.Add(_lSliderItem)
End sub
Или, если такой подход по какой-то причине исключен, то вы можете дать динамически созданному элементу управления имя и позже в своем коде использовать метод FrameworkElement.FindName() (большинство элементов управления пользовательского интерфейса будут производными от FrameworkElement). Или вы можете написать свою собственную маленькую поисковую функцию, например, такую (извините за синтаксис C#, вам не должно быть проблем с переводом ее на VB):
public static DependencyObject FindChild(this DependencyObject o, Type childType, string childName, bool checkObjectItself)
{
if (checkObjectItself && (((string)o.GetValue(FrameworkElement.NameProperty)) == childName))
return o;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
{
DependencyObject obj2 = VisualTreeHelper.GetChild(o, i).FindChild(childType, childName, true);
if (obj2 != null)
return obj2;
}
return null;
}