Как использовать открытый метод в пользовательском элементе управления без использования x:Name

У меня есть свой пользовательский элемент управления 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>

В методе Start MainWindow я вызываю метод Start MyControl, используя x:Name.

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?

Обратите внимание, что событие Loaded MyControl в моем случае неэффективно, поскольку метод MyControl Start () ДОЛЖЕН вызываться до его загрузки в качестве визуального элемента.

Также неэффективно вызывать Start в конструкторе MyControl или при его инициализации, поскольку аргумент int idNumber должен быть установлен в методе Start MainWindow.

Более того, _idNumber из MyControl и _myContolId из MainWindow должны быть приватными как для сеттера, так и для геттера.

1 ответ

Обработайте инициализированное событие вашего UserControl. <local:MyControl x:Name="myControl" Initialized="myControl_Initialized"/>

Выбор обработки Loaded или 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.

Другие вопросы по тегам