WPF:如何处理我在运行时实例化的用户控件?

时间:2010-10-05 00:04:53

标签: wpf user-controls wpf-controls wcf-instancing

我已经在我的项目中添加了一个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”是一个usercontrol,它有三个writeonly属性,声明为整数,名为“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 :(得分: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;
    }