如何在不使用x:Name的情况下在自定义控件中使用公共方法

时间:2015-10-04 08:19:15

标签: c# wpf xname

我有自定义控件MyControl,它有一个公共方法Start()。

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的Loaded事件在我的情况下是无效的,因为MyControl的Start()方法必须在作为可视元素加载之前被调用。

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

此外,对于setter和getter,MyControl的_idNumber和MainWindow的_myContolId都必须是私有的。

1 个答案:

答案 0 :(得分:1)

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

  

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

来源:FrameworkElement.Initialized Event

您应该在下面的代码中创建UserControl并添加它:

 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文件时创建。