WPF: Как мне обратиться к пользовательскому контролю, который я установил во время выполнения? - PullRequest
1 голос
/ 05 октября 2010

Я добавил 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 Ответ

0 голосов
/ 05 октября 2010

(упреждающее примечание: простите мой 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;
    }
...