如何使控件适用于窗体

本文关键字:窗体 适用于 控件 何使 | 更新日期: 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();
}