我说的是属性 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
对象,为 X
和 Y
设置值到 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 加载一个新的
setter/getter 。这个新实例再次包含原始 PrinterResolution
实例X
值。之前设置X
的实例被丢弃。
至于为什么好像我还不太了解。
关于c# - 无法为属性分配新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49409999/