Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 21.03.09 13:29 
Hallo,

ich habe ein UserControl, das mir ein Dokument darstellt und per DataBinding mit Daten füllt. Dieses UserControl möchte ich nun genau so in ein XPS rendern lassen, mit folgendem Code funktioniert das eigentlich auch:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
            Package pkg = Package.Open(@".\test.xps",FileMode.Create);
            XpsDocument xpsDoc = new XpsDocument(pkg);
            XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
            //InvoiceContent ist das zu druckende UserControl
            xpsWriter.Write(InvoiceContent);
            pkg.Close();

Wie gesagt, eigentlich funktioniert es, nur gehen sämtliche Daten verloren, die per DataBinding eingebunden wurden, ich bekomme also nur noch die Rohform des Dokuments.

Hat jemand einen Tipp für mich?

Danke im Voraus.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 21.03.09 15:04 
Das geht so einfach :shock: ? Wow, das muss ich mir merken.

Dein Problem kann ich leider nicht reproduzieren :( ;) .Mit deinem Code im Loaded-Handler und folgendem Minimal-XAML:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" DataContext="Foo"
        Loaded="Window_Loaded">
    <ComboBox x:Name="InvoiceContent" SelectedIndex="0">
        <ComboBoxItem Content="{Binding}" />
    </ComboBox>
</Window>


Ich hoffe, das war nicht zu minimal :( .

Edit: Mit
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
<ComboBox x:Name="InvoiceContent">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

und
ausblenden C#-Quelltext
1:
2:
InvoiceContent.ItemsSource = new[] { "A""B""C" };
      InvoiceContent.SelectedIndex = 0;

funktioniert's ebenfalls.

_________________
>λ=
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 21.03.09 18:31 
Habs jetzt ein wenig verändert, dann funktionierts. Ich muss die Page manuell erzeugen und den DataContext zuweisen, weiß nicht genau, warum es bei Dir geht und bei mir nicht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
            Package pkg = Package.Open(@".\invoice.xps",FileMode.Create);
            XpsDocument xpsDoc = new XpsDocument(pkg);
            XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);

            FixedDocument fixedDoc = new FixedDocument();
            PageContent pageContent = new PageContent();
            FixedPage fixedPage = new FixedPage();
            fixedPage.DataContext = this;

            //Create first page of document
            fixedPage.Children.Add(InvoiceContent);
            
            ((IAddChild)pageContent).AddChild(fixedPage);
            fixedDoc.Pages.Add(pageContent);

            xpsWriter.Write(fixedDoc);
            pkg.Close();

Das größte Problem wird jetzt aber etwas Anderes: Ich muss meine Seitenumbrüche manuell vornehmen und da hab ich noch keine Ahnung, wie das funktionieren soll. Hab nur gehört, dass es mit einer von DocumentPaginator abgeleiteten Klasse funktionieren soll und ich dort eben meine eigene Logik einbauen muss. Wie ich das aber mit einer ListView über mehrere Seiten lösen soll, bin ich noch überfragt.

Aber das ist ein anderes Thema ;)

//EDIT: Ich glaube, ich weß, warum es bei Dir ging: Das Zuweisen des DataContexts hast Du unterhalb von Window vorgenommen und auf Window-Ebene wahrscheinlich drucken lassen? Ich habe aber ein Window, dem die Datenquelle zugewiesen ist (meine KLasse, MVVM lässt grüßen ;)) und darunter per ContentControl meinen InvoiceContent eingebunden und nur das ist der Teil, den ich drucke. Dieser erbt also den DataContext von oben, aber das funktioniert dann nicht mehr mit dem XpsWriter, weil die Hierarchie ja unterbrochen ist. Eigentlich logisch.

Im Endeffekt hab ich mir ein Preview gebaut und genau das lass ich drucken, funktioniert richtig gut, wer braucht da noch Reporting-Komponenten? ;)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 21.03.09 19:36 
user profile iconUGrohne hat folgendes geschrieben Zum zitierten Posting springen:
Das Zuweisen des DataContexts hast Du unterhalb von Window vorgenommen und auf Window-Ebene wahrscheinlich drucken lassen?
Darauf habe ich doch sogar extra geachtet :P : Es wird Window.DataContext gesetzt, aber nur die ComboBox gedruckt.

Den Fehler kann ich mir immer noch nicht erklären, aber was soll's ;) .

_________________
>λ=