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