我有自定义控件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都必须是私有的。
答案 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文件时创建。