1

.Net を使用して、PC 上で実行する産業用プロセス制御アプリケーションを作成しています。このプログラムは、工場の現場でチームが組み立てるさまざまな部品の進行状況を監視します。任意の数のパーツ (1、2、3、4、5 など) が存在する可能性があり、アプリの古い VB6 バージョンでは、各パーツが独自のウィンドウを取得し、オペレーターはそれらを画面上に配置することを好みます。

私が説明しているのは、従来の MDI インターフェイスですが、WPF は MDI をサポートしていません。SO の他のスレッドは、Codeplex の wpfmdi プロジェクトを提案しましたが、それは昨年 2 月 ( http://wpfmdi.codeplex.com ) と avalondocks から "放棄" としてリストされていますが、それらはドッキング タイルであり、任意にできるようには見えません。ドラッグして移動しました。

どうすればいいのかわからない。WPF/XAML はよりクールなビジュアルと簡単なスタイリングを提供し、Microsoft は WinForms を放棄したようであるため、私は 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 に答える