如何在不使用x的情况下在自定义控件中使用公共方法:名称
我有我的自定义控件MyControl,它具有公共方法Start()。如何在不使用x的情况下在自定义控件中使用公共方法:名称
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的加载事件在我的情况下是无效的,因为MyControl的Start()方法必须在作为可视元素加载之前调用。
由于必须在MainWindow的Start方法中设置int参数idNumber,所以在MyControl的构造函数或初始化时调用Start也是无效的。
更重要的是,MainControlow的_ControlNumber和_myContolId对于setter和getter都必须是私有的。
Handle UserControl的初始化事件。 <local:MyControl x:Name="myControl" Initialized="myControl_Initialized"/>
您是否选择处理加载或初始化取决于您的 要求。如果您不需要读取元素属性,打算重置属性,并且不需要任何布局信息,则初始化的 可能是更好的事件。如果您需要 的所有属性,则该元素可用,并且您将设置 可能会重置布局的属性,Loaded可能是 采取行动时的更好事件。
来源:FrameworkElement.Initialized Event
你应该在代码中创建用户控件像下面,并将其添加:
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文件时创建它。
谢谢你的回复,但这是不可能的。我在我的问题的编辑版本中解释了我真正想做的事情。 – user4134476
谢谢,但在我的实际代码中,XAML结构要复杂得多,并且在代码隐藏中添加元素非常困难。 – user4134476
使用可以使用Bridge(自定义类),从MainWindow填充它的属性,然后处理UserControl的Initialize事件并从Bridge对象获取这些属性等。这个桥类可以声明为应用程序/窗口资源,所以它可以被MainWindow和UserControl使用。 – AnjumSKhan
调用在MyControl的构造函数中开始?或者在重载的OnInitialized方法中? – Clemens
@Clemens感谢您的快速回复,但这是不可能的。我在我的问题的编辑版本中解释了我真正想做的事情。 – user4134476