2010-07-30 168 views
2

我正在創建一個簡單的WPF打印對話框來設置標籤打印機。我希望它非常簡單,所以我選擇不使用標準的WPF printdialog。wpf簡單打印對話框頁面大小問題

所有的事情都可以接受一件事,紙張尺寸。

從一個組合框中選擇了一臺打印機後,第二個組合框將填充該設備可用的紙張尺寸。我目前正在使用selectedPrinter.GetPrintCapabilities.PageMediaSizeCapability並將其設置爲combobox的itemssource。

然而,我的這個主要問題是:

它似乎只得到可用的紙張尺寸的子集(與正常打印對話框)

沒有辦法添加自定義尺寸,因爲PageMediaSize是不可繼承和構造函數只允許您使用PageMediaSizeName枚舉

我可以顯示唯一的名稱是通過綁定diplaypath到PageMediaSizeName,這是不particul枚舉文本arly用戶友好。

我還發現,如果我將selectedPrinter.GetPrintCapabilitiesAsXml轉儲到一個文件並查看該文件,就可以得到我需要的一切;所有可用的打印機的紙張尺寸都有尺寸和重要的顯示名稱元素。

我的問題是,我是否缺少selectedPrinter.GetPrintCapabilities或我需要爲selectedPrinter.GetPrintCapabilitiesAsXml創建解析器並使用此信息?

回答

4

我結束了創建我自己的PAPERSIZE類(下),我用這個命令

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

檢索打印機的紙張尺寸爲的BindingList(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 
+0

您能否提供MMToDPI方法?謝謝。 – Yuyo 2013-08-08 16:10:41