2012-09-10 153 views
1

我正在編寫一個工業過程控制應用程序,使用.Net在PC上運行。該程序監控工廠車間各個部件的組裝過程。可以有任意數量的部分 - 1,2,3,4,5等,並且在舊的VB6版本的應用程序中,每個部分都有自己的窗口,操作員喜歡將它們排列在屏幕上。WPF中的MDI行爲?

什麼我所描述的是一個典型的MDI接口,但WPF不支持MDI。上的其他線程建議Codeplex上的wpfmdi項目,但是這列爲自去年二月(http://wpfmdi.codeplex.com)和avalondocks「拋棄」但這些都是對接的瓷磚看上去並不像他們可以隨意拖動和感動。

我不知道該怎麼辦。我不想使用WinForms,因爲WPF/XAML提供更酷的視覺效果和更簡單的樣式,因爲微軟似乎已經放棄了WinForms。目前該產品的VB6版本已有12年曆史,我希望爲新版本制定類似的使用壽命。

在此先感謝!

+0

所以你想在WPF老派MDI? – user7116

+0

我想要孩子的窗口,用戶可以自由移動,但保留在父窗口,不要遮掩主菜單。如果那是「老派」,那麼是的。 – user316117

回答

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"> 

。 。 。等等

0

我想你應該考慮使用所許,爲MDI支持第三方組件。幾乎所有標準供應商,DevExpress,Component One,Infragisitcs和Telerik都提供了MDI解決方案。

我個人認爲,MDI仍是一個完全有效的應用程序UI結構!

+0

第三方組件的問題與Winforms類似:我想要有高度的信心,我可以長期支持這一點。現有的VB6產品使用了許多已久的公司的組件,我們正在爲現代版本的Windows支持它,或者與使用最近的.Net框架的東西進行交互,令人頭疼。所以我想堅持一個「全微軟」的解決方案。 – user316117