【问题标题】:wpf simple print dialog page size issuewpf简单打印对话框页面大小问题
【发布时间】:2010-07-30 11:16:27
【问题描述】:

我正在创建一个简单的 WPF 打印对话框来设置标签打印机。我希望它非常简单,所以我选择不使用标准的 WPF 打印对话框。

一切顺利,接受一件事,纸张尺寸。

从一个组合框中选择了一台打印机后,第二个组合框将填充该设备可用的纸张尺寸。我目前正在使用 selectedPrinter.GetPrintCapabilities.PageMediaSizeCapability 并将其设置为组合框的 itemssource。

但是,我的主要问题是:

似乎只获得了可用纸张尺寸的一个子集(与普通打印对话框相比)

无法添加自定义尺寸,因为 PageMediaSize 不可继承,并且构造函数只允许您使用 PageMediaSizeName 枚举

我可以显示的唯一名称是通过将显示路径绑定到 PageMediaSizeName 的 Enum 文本,这不是特别用户友好。

我还发现,如果我将 selectedPrinter.GetPrintCapabilitiesAsXml 转储到一个文件并查看它,我会得到我需要的一切;打印机的所有可用纸张尺寸都有尺寸,重要的是显示名称元素。

我的问题是,我是否缺少 selectedPrinter.GetPrintCapabilities 的某些内容,还是需要为 selectedPrinter.GetPrintCapabilitiesAsXml 创建解析器并改用此信息?

【问题讨论】:

    标签: wpf printing printdialog


    【解决方案1】:

    我最终创建了自己的 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
    

    【讨论】:

    • 能否提供MMToDPI方法?谢谢。
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 2015-07-05
    • 2010-11-29
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2012-01-07
    • 2011-11-25
    相关资源
    最近更新 更多