1

我有我的自定义控件 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 中,我放置了一个带有 x:Name="myControl" 的 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 也是无效的,因为 int 参数 idNumber 必须在 MainWindow 的 Start 方法中设置。

更重要的是,对于 setter 和 getter,MyControl 的 _idNumber 和 MainWindow 的 _myContolId 都必须是私有的。

4

1 回答 1

1

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

您选择处理 Loaded 还是 Initialized 取决于您的要求。如果您不需要读取元素属性、打算重置属性并且不需要任何布局信息,则 Initialized 可能是更好的操作事件。如果您需要元素的所有属性都可用,并且您将设置可能重置布局的属性,则 Loaded 可能是更好的操作事件。

来源:FrameworkElement.Initialized 事件

您应该在下面的代码中创建 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 文件被解析时创建。

于 2015-10-04T08:36:13.933 回答