C# WinForms多个DPI、多个开发人员

C# WinForms多个DPI、多个开发人员,c#,winforms,version-control,visual-studio-2013,dpi,C#,Winforms,Version Control,Visual Studio 2013,Dpi,我正在和许多开发人员一起开发一个WinForms应用程序,他们有不同的屏幕配置,包括不同的DPI设置。因此,我们的应用程序可以进行缩放。我们已使用AutoScaleMode=AutoScaleMode.Font将所有表单设置为自动缩放,并根据表单的开发设置设置相应的AutoScaleDimensions 使用这些配置,WinForms可以在不同的屏幕上正确缩放,问题是当具有不同屏幕配置的开发人员以设计器模式打开窗体时,Visual Studio会通过实际修改自动生成的代码来缩放控件,以包含对象的

我正在和许多开发人员一起开发一个WinForms应用程序,他们有不同的屏幕配置,包括不同的DPI设置。因此,我们的应用程序可以进行缩放。我们已使用
AutoScaleMode=AutoScaleMode.Font
将所有表单设置为自动缩放,并根据表单的开发设置设置相应的
AutoScaleDimensions

使用这些配置,WinForms可以在不同的屏幕上正确缩放,问题是当具有不同屏幕配置的开发人员以设计器模式打开窗体时,Visual Studio会通过实际修改自动生成的代码来缩放控件,以包含对象的“新”维度,还可以通过修改and
AutoScaleDimensions
属性来匹配新监视器

如果没有几个开发人员在同一个表单上工作,这种行为就可以了。如果发生这种情况,并且这些开发人员有不同的屏幕配置,那么在使用我们的VCS合并更改时会产生大量冲突,更不用说我会为不同的屏幕分辨率存储值,从而弄乱UI


为了解决这个问题,我尝试通过设置
AutoScaleMode=AutoScaleMode.None
并为我的控件实现自定义设计器来关闭自动缩放。此设计器仅以一种分辨率保存对象的大小,然后通过隐藏
Size
属性并根据当前DPI返回缩放值。我这样做只是为了发现VS designer根据自定义设计器所说的内容生成代码,而不是实际存储在对象中的值


那么,有人知道如何绕过这个问题吗?

看来我自己找到了答案

解决方案是创建一个自定义设计器,诱使设计器在显示表单时相信它正在接收缩放值,但在生成代码时,通过自定义设计器的
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 ...
}

AutoScaleMode=AutoScaleMode.Dpi
@bansi您可以这样做,它将导致相同的行为。设计师将修改自动生成代码上的值以匹配新的DPI。忽略提交时自动生成的代码块(如果你的VCS可以做到的话)?@Lazybacker好吧,这在尝试在多个开发人员之间开发表单时是没有用的,因为一个开发人员无法看到其他开发人员所做的更改!