wpf простой диалог печати размер страницы вопрос - PullRequest
2 голосов
/ 30 июля 2010

Я создаю простое диалоговое окно печати WPF для настройки принтера этикеток.Я хочу, чтобы это было очень просто, и поэтому я решил не использовать стандартный диалог печати WPF.

Все идет хорошо, с одной стороны, размеры бумаги.

Выбрав принтер изодин комбинированный список, второй комбинированный список заполняется форматами бумаги, доступными с этого устройства.В настоящее время я использую selectedPrinter.GetPrintCapabilities.PageMediaSizeCapability и устанавливаю его в качестве источника элементов в выпадающем списке.

Тем не менее, у меня есть следующие основные проблемы:

Кажется, он получает только подмножество доступных форматов бумаги (по сравнению с обычным диалоговым окном печати)добавьте нестандартные размеры, поскольку PageMediaSize не наследуется, и конструктор позволяет использовать только перечисление PageMediaSizeName

и

. Единственное имя, которое я могу отобразить, - это текст Enum путем привязки diplaypath к PageMediaSizeName, которыйне особо удобен для пользователя.

Я также обнаружил, что если я дам дамп selectedPrinter.GetPrintCapabilitiesAsXml в файл и посмотрю на это, я получу все, что мне нужно;все доступные размеры бумаги принтера, каждый из которых имеет размеры и, что важно, элемент отображаемого имени.

Мой вопрос: я что-то упустил с selectedPrinter.GetPrintCapabilities или мне нужно создать анализатор для selectedPrinter.GetPrintCapabilitiesAsXml ииспользовать эту информацию вместо?

1 Ответ

4 голосов
/ 02 сентября 2010

В итоге я создал собственный класс PaperSize (ниже) и использую эту команду

PaperSize.ParsePaperSizeXML(New Xml.XmlTextReader(selectPrinter.GetPrintCapabilitiesAsXml))

для получения доступных форматов бумаги принтера в виде списка переплетов (selectedPrinter является экземпляром класса Printing.PrintQueue)

Public Class PaperSize

    Const FEATURENODE As String = "psf:Feature"
    Const PAPERSIZEATTRIBUTE As String = "psk:PageMediaSize"
    Const PAPEROPTIONNODE As String = "psf:Option"
    Const SCOREDPROPERTYNODE As String = "psf:ScoredProperty"
    Const WIDTHATTRIBUTE As String = "psk:MediaSizeWidth"
    Const HEIGHTATTRIBUTE As String = "psk:MediaSizeHeight"
    Const VALUENODE As String = "psf:Value"
    Const PROPERTNODE As String = "psf:Property"
    Const DISPLAYNAMEATTRIBUTE As String = "psk:DisplayName"
    Const NAMEATTRIBUTE As String = "name"

    Public Sub New()

    End Sub

    Public Sub New(ByVal PaperKey As String, ByVal PaperDisplayName As String)
        DisplayName = PaperDisplayName
        Width = Nothing
        Height = Nothing
    End Sub

    Public Sub New(ByVal PaperKey As String, ByVal PaperDisplayName As String, ByVal PaperWidth As Double?, ByVal PaperHeight As Double?)
        Key = PaperKey
        DisplayName = PaperDisplayName
        Width = PaperWidth
        Height = PaperHeight
    End Sub

    Property Key As String
    Property DisplayName As String
    Property Width As Double?
    Property Height As Double?


    Public ReadOnly Property WidthInMM As Double?
        Get
            If Width.HasValue Then
                Return WidthInInches * 25.4
            Else
                Return Nothing
            End If

        End Get
    End Property

    Public ReadOnly Property HeightInMM As Double?
        Get
            If Height.HasValue Then
                Return HeightInInches * 25.4
            Else
                Return Nothing
            End If


        End Get
    End Property

    Public ReadOnly Property WidthInInches As Double?
        Get
            If Width.HasValue Then
                Return Width / 96
            Else
                Return Nothing
            End If
        End Get
    End Property

    Public ReadOnly Property HeightInInches As Double?
        Get
            If Height.HasValue Then
                Return Height / 96
            Else
                Return Nothing
            End If
        End Get
    End Property

    Public Shared Function ParsePaperSizeXML(ByVal XmlString As Xml.XmlReader) As ComponentModel.BindingList(Of PaperSize)

        Dim lstPaperSizes As New ComponentModel.BindingList(Of PaperSize)

        Try

            While XmlString.Read()

                If XmlString.NodeType = Xml.XmlNodeType.Element Then
                    Select Case XmlString.Name
                        Case FEATURENODE
                            If XmlString.AttributeCount = 1 Then
                                Select Case XmlString.GetAttribute(NAMEATTRIBUTE)
                                    Case PAPERSIZEATTRIBUTE
                                        lstPaperSizes = processAllPaperSizes(XmlString.ReadSubtree)
                                End Select
                            End If
                    End Select

                End If

            End While

        Catch ex As Exception
            Throw ex
        End Try

        Return lstPaperSizes

    End Function

    Private Shared Function processAllPaperSizes(ByVal PaperSizeXmlString As Xml.XmlReader) As ComponentModel.BindingList(Of PaperSize)
        Dim lstPaperSizes As New ComponentModel.BindingList(Of PaperSize)
        Dim currentKey As String

        Try

            While PaperSizeXmlString.Read()

                If PaperSizeXmlString.NodeType = Xml.XmlNodeType.Element Then
                    Select Case PaperSizeXmlString.Name
                        Case PAPEROPTIONNODE
                            currentKey = PaperSizeXmlString.GetAttribute(NAMEATTRIBUTE)

                            lstPaperSizes.Add(processPaperSize(currentKey, PaperSizeXmlString.ReadSubtree))

                    End Select

                End If

            End While

        Catch ex As Exception
            Throw ex
        End Try
        Return lstPaperSizes
    End Function

    Private Shared Function processPaperSize(ByVal currentPaperKey As String, ByVal PaperSizeXmlString As Xml.XmlReader) As PaperSize

        Dim currentWidth, currentHeight As Double?
        Dim currentName As String = String.Empty
        Dim stringwidth, stringheight As String

        Try

            While PaperSizeXmlString.Read()

                If PaperSizeXmlString.NodeType = Xml.XmlNodeType.Element Then
                    Select Case PaperSizeXmlString.Name
                        Case SCOREDPROPERTYNODE

                            If PaperSizeXmlString.AttributeCount = 1 Then
                                Select Case PaperSizeXmlString.GetAttribute(NAMEATTRIBUTE)
                                    Case WIDTHATTRIBUTE
                                        stringwidth = processPaperValue(PaperSizeXmlString.ReadSubtree)
                                        If String.IsNullOrEmpty(stringwidth) Then
                                            currentWidth = Nothing
                                        Else
                                            currentWidth = MasterWPFUtils.MMToDPI(CDbl(stringwidth)) / 1000
                                        End If

                                    Case HEIGHTATTRIBUTE
                                        stringheight = processPaperValue(PaperSizeXmlString.ReadSubtree)
                                        If String.IsNullOrEmpty(stringheight) Then
                                            currentHeight = Nothing
                                        Else
                                            currentHeight = MasterWPFUtils.MMToDPI(CDbl(stringheight)) / 1000
                                        End If
                                End Select
                            End If
                        Case PROPERTNODE
                            If PaperSizeXmlString.AttributeCount = 1 Then
                                Select Case PaperSizeXmlString.GetAttribute(NAMEATTRIBUTE)
                                    Case DISPLAYNAMEATTRIBUTE
                                        currentName = processPaperValue(PaperSizeXmlString.ReadSubtree)
                                End Select
                            End If
                    End Select

                End If

            End While
            Return New PaperSize(currentPaperKey, currentName, currentWidth, currentHeight)
        Catch ex As Exception
            Throw ex
        End Try

    End Function

    Private Shared Function processPaperValue(ByVal valueXmlString As Xml.XmlReader) As String
        Try

            While valueXmlString.Read()

                If valueXmlString.NodeType = Xml.XmlNodeType.Element Then
                    Select Case valueXmlString.Name
                        Case VALUENODE
                            Return valueXmlString.ReadElementContentAsString.Trim
                    End Select
                End If
            End While
        Catch ex As Exception
            Throw ex
        End Try

        Return String.Empty
    End Function

End Class
...