2010-07-30 3 views
2

간단한 WPF 인쇄 대화 상자를 만들어 레이블 프린터를 설정합니다. 매우 간단하기 때문에 표준 WPF 인쇄 대화 상자를 사용하지 않도록 선택했습니다.wpf 간단한 인쇄 대화 상자 페이지 크기 문제

모든 것이 용지 크기에 대해 잘 받아 들여지고 있습니다.

하나의 콤보 상자에서 프린터를 선택하면 두 번째 콤보 상자에 해당 장치에서 사용할 수있는 용지 크기가 채워집니다. 현재 selectedPrinter.GetPrintCapabilities.PageMediaSizeCapability를 사용하고 있으며 콤보 상자의 항목 소스로 설정하고 있습니다.

그러나,이 내 주요 문제는 다음과 같습니다

PageMediaSize이기 때문에 전용 (일반 인쇄 대화 상자에 비해) 사용 가능한 용지 크기의 부분 집합

사용자 정의 크기를 추가 할 수있는 방법을 얻을 것으로 보인다 하지 상속과 생성자는 당신이 PageMediaSizeName 열거를 사용할 수 있습니다

내가 표시 할 수있는 유일한 이름은 particul하지 PageMediaSizeName에 diplaypath을 결합하여 열거 텍스트입니다 사용자 친화적이다.

내가 찾은 것은 selectedPrinter.GetPrintCapabilitiesAsXml을 파일에 덤프하고 그 파일을 보면 필요한 모든 것을 얻을 수 있다는 것입니다. 모든 availble 프린터 크기의 용지 크기와 중요한 표시 이름 요소.

제 질문은 selectedPrinter.GetPrintCapabilities와 함께 뭔가가 누락되었거나 selectedPrinter.GetPrintCapabilitiesAsXml에 대한 파서를 만들어 대신이 정보를 사용해야합니까?

답변

4

내가 내 자신의를 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 
+0

MMToDPI 방법을 제공 할 수 있습니까? 감사. – Yuyo