如何使控件适用于窗体
本文关键字:窗体 适用于 控件 何使 | 更新日期: 2023-09-27 18:00:07
我在WPF中为我们的小团队制作了一个可重用的控件:一个我们经常使用的简单对话框。窗口的处理是用一种专用方法完成的:
private static void ExecuteInternal(
Window owner,
string windowTitle,
string label,
object operation,
MyDialogSettings settings)
{
MyDialog dialog = new MyDialog(windowTitle, settings);
dialog.Owner = owner;
dialog.Label = label;
ShowDialog();
}
公共调用有一个System.Windows.Window
作为参数(-->WPF窗口),我的函数将Owner
设置为此窗口。现在,我的同事想从Windows窗体应用程序中使用此窗口。
我的第一个想法是用一个表单重载公共函数调用,然后在内部用WindowInteropHelper
处理它(请参阅:http://blogs.msdn.com/b/mhendersblog/archive/2005/10/04/476921.aspx)
但是我必须在使用我的库的每个(WPF)-项目中引用Windows.Forms
。因为我无法从WindowInteropHelper外部访问窗口实例,所以在Forms应用程序中无法完成这件事。
有什么想法吗?
我看到这种方法的问题是可重用控件根本不可重用。正如您所注意到的,主方法只使用WPF类型,这些类型不能在其他地方使用,因此目前不可能在WinForms上重用。
要做到这一点,您需要将对话框窗口的主要逻辑和视觉效果提取到用户控件中(这样它就可以托管在WinForms中)。这是我要做的第一件事:
<UserControl .......>
<Grid>
<!-- Other controls you have on the dialog -->
<Button Content="Accept"/>
</Grid>
</UserControl>
非常简单,只需将所有内容移动到用户控件即可。然后,只包含以下控件,窗口本身就变得微不足道:
<Window .......>
<controls:MyDialogContent ..../>
</Window>
到目前为止,一切都没有改变,你发布的方法和以前完全一样。我们将只保留它作为WPF,然后为WinForms实现一个几乎相同的方法。
在WinForms项目中,现在您必须创建将取代MyDialog
的表单。这个表单可以像WPF版本一样简单,只是一个ElementHost,它将包含您之前分离的UserControl,以及您的逻辑所需的任何属性/方法。
最后一部分是提供一个WinForms方法来调用它,类似于WPF方法。这可以像这样简单:
private static void ExecuteInternal(Form owner,
string windowTitle,
string label,
object operation,
MyDialogSettings settings)
{
MyDialogForm dialog = new MyDialogForm(windowTitle, settings);
dialog.Owner = owner;
dialog.Label = label;
dialog.ShowDialog();
}