1

我正在使用 .Net 编写一个在 PC 上运行的工业过程控制应用程序。该程序监控工厂车间团队组装的各种零件的进度。可以有任意数量的部件 - 1、2、3、4、5 等,在旧的 VB6 版本的应用程序中,每个部件都有自己的窗口,操作员喜欢在屏幕上排列它们。

我所描述的是一个经典的 MDI 界面,但 WPF 不支持 MDI。SO 上的其他线程建议了 Codeplex 上的 wpfmdi 项目,但自去年 2 月 ( http://wpfmdi.codeplex.com ) 和 avalondocks以来,该项目被列为“已放弃” ,但这些是看起来不像可以任意设置的对接图块拖动和移动。

我不知道该怎么办。我不想使用 WinForms,因为 WPF/XAML 提供了更酷的视觉效果和更简单的样式,而且微软似乎已经放弃了 WinForms。该产品的当前 VB6 版本已有 12 年历史,我想为新产品计划类似的使用寿命。

提前致谢!

4

2 回答 2

0

我认为您应该考虑使用付费的第三方组件来获得 MDI 支持。几乎所有的标准供应商,DevExpress、Component One、Infragisitcs、Telerik 都提供 MDI 解决方案。

就个人而言,我认为 MDI 仍然是一个完全有效的应用程序 UI 结构!

于 2012-09-10T20:02:31.853 回答
0

我在另一个讨论论坛上找到了答案(我不记得是哪一个,否则我会给予他们信任)。结果比我想象的要容易。如果您挂钩 WM_MOVING 消息(我这样做,在加载窗口时下方),您可以在窗口移动之前拦截移动并限制窗口的位置。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    WindowInteropHelper helper = new WindowInteropHelper(this);
    HwndSource.FromHwnd(helper.Handle).AddHook(HwndMessageHook);

    InitialWindowLocation = new Point(this.Left, this.Top);
}

// Grab the Win32 WM_MOVING message so we can intercept a move BEFORE 
// it happens and constrain the child window's location.

private IntPtr HwndMessageHook(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool bHandled)
{
    switch (msg)
    {
        //   might also want to handle case WM_SIZING:
        case WM_MOVING:
            {
                WIN32Rectangle rectangle = (WIN32Rectangle)Marshal.PtrToStructure(lParam, typeof(WIN32Rectangle));

                if (rectangle.Top < 50)
                {
                    rectangle.Top = 50;
                    rectangle.Bottom = 50 + (int)this.Height;
                    bHandled = true;
                }

                if (rectangle.Left < 10)
                {
                    rectangle.Left = 10;
                    rectangle.Right = 10 + (int)this.Width;
                    bHandled = true;
                }

                if (rectangle.Bottom >800)
                {
                    rectangle.Bottom = 800;
                    rectangle.Top = 800 - (int)this.Height;
                    bHandled = true;
                }

                // do anything to handle Right case?
                if (bHandled)
                {
                    Marshal.StructureToPtr(rectangle, lParam, true);
                }
            }
            break;
    }
    return IntPtr.Zero;
}

XAML 标头如下所示:

<Window x:Class="Mockup_9.Entity11"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Mockup_9"
        ShowInTaskbar="False"
        Background="LightGoldenrodYellow"
        Loaded="Window_Loaded"
        Title="Mockup_part -" Height="540" Width="380" ResizeMode="NoResize"
        Icon="/Mockup_9;component/Images/refresh-icon1.jpg">

. . . 等等

于 2012-10-23T19:17:16.480 回答