Potrzebuję uzyskać rozmiar papieru przez System.Drawing.Printing.PaperKind. Czy są jakieś predefiniowane wartości? Nie chcę kodować ani kalkulować rozmiarów papieru, chcę go tylko programowo. Dzięki.Jak uzyskać wstępnie zdefiniowany rozmiar papieru przez PaperKind
Odpowiedz
Podzbiór ustalonych wartości można było go przez powtarzanie nad PrinterSettings.PaperSizes
kolekcji.
Nasza aplikacja umożliwia użytkownikowi wybór drukarki, dostarczając nam obiekt PrinterSettings
. Zawarty w PrinterSettings
jest listą PaperSize
obsługiwanych przez drukarkę - nie wszystko (zwróć uwagę, że sterownik dokumentu XPS (win7) obsługuje wszystkie rozmiary).
W naszym przypadku ten podzbiór obsługiwanych rozmiarów jest wszystkim, czego potrzebujemy. Użytkownik podany PaperKind
jest przekazywany do naszego kodu drukowania i przechodzi przez nasz obiekt PrinterSettings
, dopóki nie znajdzie wyboru użytkownika lub zrezygnuje i używa wartości domyślnej.
W poniższym przykładzie widać, że obiekty PaperSize
są poprawnie wypełnione.
PrinterSettings settings = new PrinterSettings();
foreach (PaperSize size in settings.PaperSizes)
Debug.WriteLine(size);
To tylko podzbiór, ale może to również wystarczy. drukowanie API w .NET jest naprawdę niejasne, a msdn nie jest zbyt dużą pomocą ... Mam nadzieję, że postawi to na dobrej drodze!
Możesz wypróbować klasę System.Drawing.Printing.PaperSize. Istnieje własność RawKind, którą można ustawić na System.Drawing.Printing.PaperKind.
Coś jak:
PaperSize size = new PaperSize();
size.RawKind = (int) PaperKind.A3;
LINQ sposób, aby osiągnąć swój cel jest coś takiego:
PrinterSettings printerSettings = new PrinterSettings();
IQueryable<PaperSize> paperSizes = printerSettings.PaperSizes.Cast<PaperSize>().AsQueryable();
PaperSize a4rotated = paperSizes.Where(paperSize => paperSize.Kind == PaperKind.A4Rotated).FirstOrDefault();
Powodzenia!
// https://stackoverflow.com/questions/17602366/why-can-i-not-call-toarray -na-a-generic-ienumerable-object przy użyciu System.Linq; – udoline
public static PaperSize GetPaperSize(string Name)
{
PaperSize size1 = null;
Name=Name.ToUpper();
PrinterSettings settings = new PrinterSettings();
foreach (PaperSize size in settings.PaperSizes)
if (size.Kind.ToString().ToUpper() == Name)
{
size1 = size;
break;
}
return size1;
}
PaperSize pkSize;
PrintDocument printDoc = new PrintDocument();
for (int i = 0; i < printDoc.PrinterSettings.PaperSizes.Count; i++)
{
pkSize = printDoc.PrinterSettings.PaperSizes[i];
cmbPaperSize.Items.Add(pkSize);
}
Dodaj małe wyjaśnienie do swojej odpowiedzi, aby wyjaśnić, dlaczego to działa. – Morgoth
użyj tego przy użyciu System.Drawing.Printing; –
No. W tym przypadku wysokość i szerokość są nadal 0. – alga
człowiek, można by pomyśleć, że to jakiś rodzaj klasy pomocnika do tego. http://msdn.microsoft.com/en-us/library/system.drawing.printing.paperkind.aspx zawiera listę wszystkich PaperKind wraz z wysokością i szerokością. Być może powinieneś napisać klasę pomocnika i opublikować ją? – hackerhasid
Widziałem tę enumową klasę. Ale chciałem nie pisać żadnych zajęć, ponieważ mogą być już napisane. – alga