2014-10-01 118 views
0

我正在開發一個WinForms應用程序以及大量開發人員,他們擁有不同的屏幕配置,其中包括不同的DPI設置。因此,我們的應用程序可以擴展我們設置的所有窗體,使用AutoScaleMode = AutoScaleMode.Font自動縮放,並設置相應的AutoScaleDimensions,具體取決於開發窗體的設置。WinForms多個DPI,多個開發人員

利用這些構造的WinForms適當縮放跨不同的屏幕,問題是,當用不同屏結構的顯影劑打開在設計者模式的形式,Visual Studio中通過實際修改自動生成的代碼包含縮放控制對象的「新」尺寸,以及修改和AutoScaleDimensions屬性以匹配新的監視器。

如果我沒有幾個開發人員在同一個表單上工作,這種行爲是可以的。如果發生這種情況,並且這些開發人員擁有不同的屏幕配置,那麼在使用我們的VCS合併這些更改時會產生大量衝突,而不是說我將爲不同的屏幕分辨率存儲值,從而搞亂了用戶界面。

爲了解決這個問題,我嘗試通過設置AutoScaleMode = AutoScaleMode.None併爲我的控件實現自定義設計器來關閉自動縮放功能。這位設計師只將對象的尺寸保存在一個分辨率中,然後通過隱藏Size屬性並根據當前DPI返回縮放值。我這樣做只是爲了發現VS設計人員根據定製設計人員所說的生成代碼,而不是實際存儲在對象中的值。

那麼,有沒有人知道如何解決這個問題?

+0

'AutoScaleMode = AutoScaleMode.Dpi' [MSDN](http://msdn.microsoft.com/en-us/library/system.windows.forms。 autoscalemode(v = vs.110).aspx) – bansi 2014-10-01 03:43:04

+0

@bansi你可以這樣做,它會導致相同的行爲。設計人員將修改自動生成的代碼上的值以匹配新的DPI .. – cgledezma 2014-10-01 03:45:38

+0

在提交時忽略一些自動生成的代碼塊(如果您的VCS可以這樣做)? – 2014-10-01 09:53:17

回答

0

好吧,好像我自己找到了答案。

解決方案是創建一個自定義設計器,讓設計師相信它在顯示錶單時會收到一個縮放值,但是當生成代碼給他的非縮放值時,通過ShadowedProperties的數組自定義設計,如在下面的代碼爲例進行說明:

// This is the custom designer 
public class ScalingDesigner : ControlDesigner 
{ 
    public ScalingDesigner(){}; 

    // Say we want to correct the Size property 
    public Size Size 
    { 
     get 
     { 
      // When the serializer asks for the value, give him the shadowed one 
      return (Size)this.ShadowedProperties["Size"] 
     } 
     set 
     { 
      // When setting the value, assign the standard-DPI based value to the one the serializer would use 
      this.ShadowedProperties["Size"] = value; 

      // ... perform all the DPI scaling logic ... 

      // Then assign a scaled value to the displayed control 

      this.Control.Size = new Size(scaledWidth, scaledHeight) 
     } 
    } 


    // Associate the shadowed values 
    public override void PreFilterProperties(IDictionary properties) 
    { 
     base.PreFilterProperties(properties); 

     properties["Size"] = 
      TypeDescriptor.CreateProperty(
       typeof(ScalingDesigner), 
       (PropertyDescriptor)properties["Size"], 
       new Attribute[0]); 
    } 
} 

// ... and on your control ... 
[Designer(typeof(ScalingDesigner))] 
public class MyControl : Control 
{ 
    // ... whatever logic you want to implement ... 
}