c# - 无法为属性分配新值

标签 c# properties

我说的是属性 PageSettings.PrinterResolution。根据MSDN此属性有一个 setter,与属性 PrinterResolution.X 相同,即使我无法为其设置新值。该属性仍然包含它的早期值,而不是新分配的值。

PrintDocument pd = new PrintDocument();    
//assigning a printer to `pd`, etc...

//premise: pd.DefaultPageSettings.PrinterResolution.X has currently the value 200

现在我尝试为 X 分配一个新的 int 值:

pd.DefaultPageSettings.PrinterResolution.X = 300;

但是在检查它的值后 pd.DefaultPageSettings.PrinterResolution.X 仍然包含 200。我只是想分配一个新的 PrinterResolution 对象,为 XY 设置值到 pd.DefaultPageSettings.PrinterResolution 根据我的需要更改值。

PrinterResolution changedRes = new PrinterResolution();
changedRes.X = 200;
changedRes.Y = 200;

pd.DefaultPageSettings.PrinterResolution = changedRes;

那么为什么我不能设置属性的值呢?特别是为什么有一个记录在案的 setter,即使它不是“可用”

最佳答案

如果您查看 reference source PageSettings 您会看到 PrinterResolution 总是从 API 重新请求(只要您不手动设置 PrinterResolution 属性) :

public PrinterResolution PrinterResolution {
    [ResourceExposure(ResourceScope.None)]
    [ResourceConsumption(ResourceScope.Process, ResourceScope.Process)]
    get {
        if (printerResolution == null) {
            IntSecurity.AllPrintingAndUnmanagedCode.Assert();

            IntPtr modeHandle = printerSettings.GetHdevmode();
            IntPtr modePointer = SafeNativeMethods.GlobalLock(new HandleRef(this, modeHandle));
            SafeNativeMethods.DEVMODE mode = (SafeNativeMethods.DEVMODE) UnsafeNativeMethods.PtrToStructure(modePointer, typeof(SafeNativeMethods.DEVMODE));

            PrinterResolution result = PrinterResolutionFromMode(mode);

            SafeNativeMethods.GlobalUnlock(new HandleRef(this, modeHandle));
            SafeNativeMethods.GlobalFree(new HandleRef(this, modeHandle));

            return result;
        }
        else
            return printerResolution;
    }
    set {
        printerResolution = value;
    }
}

只要您不手动设置 PageSettings.PrinterResolution,每次您访问 PageSettings.PrinterResolution 时都会从 API 加载一个新的 PrinterResolution 实例 setter/getter 。这个新实例再次包含原始 X 值。之前设置X的实例被丢弃。

至于为什么好像我还不太了解。

关于c# - 无法为属性分配新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49409999/

相关文章:

python - 不将任何内容传递给属性会导致崩溃

c# - 为什么要使用成员变量?

object - 使用变量设置 Twig 对象属性名称

javascript - 在 JavaScript 中,哪种创建具有属性的对象的方法最有效?

c# - 当键不是简单的原始类型时使用 ContainsKey()

c# - 多平台2D游戏引擎

c# 如何正确写入 .dbf (foxpro)

c# - 如何在我的 C# 项目中找到所有静态变量?

java - 使用 Spring 覆盖外部属性文件中的属性(如果存在)

c# - 如何在 ASP.NET 中监听 IIS 关闭事件