1

我在我的项目中添加了一个用户控件,如下所示:

    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

但仅限于子程序内。我不知道如何在表单中的其他地方引用控件值,因为如果我尝试从其他子中通过其名称调用控件,编译器自然会告诉我该控件不是项目的一部分,因为它尚未创建。

我在该主题上所能找到的所有内容都涉及在代码隐藏中创建控件,但请注意如何连接到以我的方式实例化的用户控件。

4

1 回答 1

0

(先发制人:原谅我的 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()方法(大多数 UI 控件将派生自 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;
    }
于 2010-10-05T01:08:16.093 回答