1

我繼承了現有的Windows移動應用,專爲觸摸屏設備的景觀,但現在我需要把它擴大到在一個較小的分辨率下工作肖像設備。溶液(VS2008)的設置如下:我怎麼能擴展現有的Windows Mobile應用程序具有不同屏幕設備工作的尺寸

  • 助手項目
  • 用戶控制項目
  • 主體計劃項目

助手具有如DB連接一些共享代碼,例如,錯誤報告,自定義對象等。用戶控件有自定義按鈕,自定義鍵盤/數字鍵盤等主程序是大量代碼與一個基本形式和幾個用戶控件作爲頁面的地方。 '網頁'根據需要顯示/隱藏。

什麼,我想的是如何使這項工作的第二(縱向)設備,併爲此事的意見,可能在將來一起去的任何其他設備。

我最初的想法是將所有可以共享的業務邏輯從主程序轉移到助手中,然後爲重新設計的窗體和用戶控件(頁面)添加一個主程序(人像)項目以用於較小的屏幕。這樣,景觀和肖像項目可以獨立部署。

當我嘗試這個,但是我無法從助手訪問主程序基礎形式。 VS不會允許我將主引用添加到主程序的助手中。我猜這是由於循環引用。有沒有一種方法可以做到這一點,以便我可以傳遞橫向/縱向和表單名稱作爲參數來知道要定位哪個項目?肖像版本將以完全相同的方式運行,但只顯示在較小的屏幕上。

另一個想法是調整上飛的形式和用戶控制在檢測到更小的屏幕,但似乎長篇大論和笨重時。我不認爲使用錨定和對接是一種選擇,因爲只是顯示較小版本的橫向格式會破壞縱向設備的可用性。

我試圖讓這個問題儘可能短,但如果你需要更多的信息只是問。任何幫助你可以提供將不勝感激。

回答

0

答案很大程度上取決於原始開發人員是否在他的表單中埋藏了大量業務邏輯。他們的邏輯越多,你就會付出更多的努力來解決這個問題。

個人而言,我經常代碼我業務邏輯是具有到接口(而不是形式或全屏用戶控件)的參考,其具有所需的必要屬性和事件單獨的控制器類。然後在完全獨立的項目中(每個設備佈局一個),我創建我的屏幕並實現UI界面。這個appraoch允許你很容易地添加設備。

如果你有一噸在形式邏輯的這另一個版本是把所有的形式爲基類,使得所有的代碼,甚至事件處理程序residethere。通過將控件標記爲受保護或讓基類提供虛擬方法來訪問它們,使控件可用於子類。然後,在您從基礎表單繼承的每個特定於設備的UI項目中。

在這兩種方法中,您的衛星UI項目都會引用基類。您打破循環引用,並通過人們調用控件的現在反向的概念,實現只需要用戶界面的運行時加載,但它確實只是動態加載類型。就我個人而言,我一直在使用一個簡單的配置文件爲這個和一個簡單的實用程序類年齡和它工作正常。這是我的裝載機類。在看這個,你也可以使用泛型擺脫derivesFrom參數,避免了演員,但是這將讓你開始:

public static class ObjectLoader 
{ 
//---------------------------------------------------------------------- 
// public static methods 
//---------------------------------------------------------------------- 

public static object LoadFromAssembly(
    string srcAssembly, 
    string typeName, 
    Type derivesFrom) 
{ 
    return LoadFromAssembly(srcAssembly, typeName, derivesFrom, true); 
} 

public static object LoadFromAssembly(
    string srcAssembly, 
    string typeName, 
    Type derivesFrom, 
    bool throwOnLoadError) 
{ 

    if (srcAssembly == null) 
     throw new ArgumentNullException("srcAssembly"); 
    else if (srcAssembly.Length == 0) 
     throw new ArgumentException("Value may not be empty.", "srcAssembly"); 
    else if (typeName == null) 
     throw new ArgumentNullException("typeName"); 
    else if (typeName.Length == 0) 
     throw new ArgumentException("Value may not be empty.", "typeName"); 
    else if (derivesFrom == null) 
     throw new ArgumentNullException("derivesFrom"); 

    object retVal = null; 

    try 
    { 
     string srcAssemblyPath = Path.Combine(AppDir, srcAssembly); 
     Assembly asm = Assembly.LoadFrom(srcAssemblyPath); 
     object obj = asm.CreateInstance(typeName); 

     if (obj != null && derivesFrom.IsAssignableFrom(obj.GetType())) 
     { 
      retVal = obj; 
     } 
     else if (obj != null) // wrong object, cleanup as needed 
     { 
      if (obj is IDisposable) 
       ((IDisposable)obj).Dispose(); 
     } 
    } 
    catch (Exception ex) 
    { 
     if (throwOnLoadError) 
      throw; 
     // otherwise null is returned... 
    } 

    return retVal; 
} 

//---------------------------------------------------------------------- 
// private static methods 
//---------------------------------------------------------------------- 

private static string AppDir 
{ 
    get 
    { 

     string appFullPath = Assembly.GetExecutingAssembly().GetName().CodeBase; 
     return Path.GetDirectoryName(appFullPath); 
    } 
} 

} 

祝你好運!

+0

感謝您花時間回覆tcarvin並提供您的裝載機班。我之前沒有使用過這種方法,所以我會離開,看看我能否實現它。我會回報。 哦,是的,我會說80%的業務邏輯被埋在表格中*嘆氣*嘿,這將是值得的,因爲我剛剛發現更多的設備將在稍後推出那一年。 – cspete

+0

發佈您的反饋或問題後,你有機會玩弄這一切。祝你好運! – tcarvin

+1

謝謝tcarvin我去基地班的方法,並解決了我的問題。它需要一段時間,因爲業務邏輯的數量要分開。現在,添加額外的UI將涉及最小的複製和粘貼。 – cspete

相關問題