2015-10-04 50 views
1

我有我的自定义控件MyControl,它具有公共方法Start()。如何在不使用x的情况下在自定义控件中使用公共方法:名称

public partial class MyControl : UserControl 
{ 
    // This must be private. 
    private int _idNumber; 

    public MyControl() 
    { 
     InitializeComponent(); 
    } 

    public void Start(int idNumber) 
    { 
     _idNumber = idNumber; 
    } 
} 

在MainWindow中,我将一个MyControl与x:Name =“myControl”放在一起。

<Window x:Class="MyNameSpace.MainWindow" 
     xmlns:local="clr-namespace:MyNameSpace"> 
    <Grid> 
     <local:MyControl x:Name="myControl"/> 
    </Grid> 
</Window> 

在MainWindow的Start方法中,我使用x:Name调用MyControl的Start方法。

public partial class MainWindow : Window 
{ 
    // This must be private 
    private int _myContolId; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void Start() 
    { 
     // ID must be set here. 
     _myControlId = 1; 
     myControl.Start(_myControlId); 
    } 
} 

如何在不使用x:Name的情况下做同样的事情?

请注意,MyControl的加载事件在我的情况下是无效的,因为MyControl的Start()方法必须在作为可视元素加载之前调用。

由于必须在MainWindow的Start方法中设置int参数idNumber,所以在MyControl的构造函数或初始化时调用Start也是无效的。

更重要的是,MainControlow的_ControlNumber和_myContolId对于setter和getter都必须是私有的。

+1

调用在MyControl的构造函数中开始?或者在重载的OnInitialized方法中? – Clemens

+0

@Clemens感谢您的快速回复,但这是不可能的。我在我的问题的编辑版本中解释了我真正想做的事情。 – user4134476

回答

1

Handle UserControl的初始化事件。 <local:MyControl x:Name="myControl" Initialized="myControl_Initialized"/>

您是否选择处理加载或初始化取决于您的 要求。如果您不需要读取元素属性,打算重置属性,并且不需要任何布局信息,则初始化的 可能是更好的事件。如果您需要 的所有属性,则该元素可用,并且您将设置 可能会重置布局的属性,Loaded可能是 采取行动时的更好事件。

来源:FrameworkElement.Initialized Event

你应该在代码中创建用户控件像下面,并将其添加:

public partial class MainWindow : Window 
{ 
// This must be private 
private int _myContolId; 

public MainWindow() 
{ 
    InitializeComponent(); 
} 

public void Start() 
{ 
    // ID must be set here. 
    _myControlId = 1; 
    MyControl myControl = new MyControl(); 
    myControl.Start(_myControlId); 

    GridContainer.Children.Add(myControl); 
} 

}

这将解决您的问题。如果您声明元素/控件XAML,则会在解析XAML文件时创建它。

+0

谢谢你的回复,但这是不可能的。我在我的问题的编辑版本中解释了我真正想做的事情。 – user4134476

+0

谢谢,但在我的实际代码中,XAML结构要复杂得多,并且在代码隐藏中添加元素非常困难。 – user4134476

+0

使用可以使用Bridge(自定义类),从MainWindow填充它的属性,然后处理UserControl的Initialize事件并从Bridge对象获取这些属性等。这个桥类可以声明为应用程序/窗口资源,所以它可以被MainWindow和UserControl使用。 – AnjumSKhan

相关问题