2010-09-27 6 views
1

J'essaie de convertir le contrôle XAML en document XPS, mais je voudrais le faire en mode batch - rendre le contrôle en mémoire et l'imprimer en XPS sans le rendre l'écran. Ce projet devrait fonctionner même sans interface graphique. J'ai lu Related topic on stackoverflow, mais cela ne fonctionne pas correctement. Je peux créer un contrôle, définir DataContext, mais la sortie xps est vide. Si je rends le contrôle sur l'écran puis l'imprime, tout va bien, mais si je veux le faire en mode batch, j'ai un document vide (il n'y avait que des étiquettes statiques etc.)Impression de documents via Wpf-controls et conversion en XPS

Comment puis-je forcer contrôle pour lier les contrôles avec des données? La prochaine partie difficile serait: comment puis-je ajouter mon en-tête personnalisé sur chaque page si j'imprime le contrôle de plusieurs pages? (ex: liste?)

+0

Je suggérerais fortement d'écarter cette deuxième question car c'est une question beaucoup plus complexe. – Will

+0

BTW, la deuxième question, la seule chose que j'ai jamais vu venir près de résoudre ce problème a été discuté dans ce blog à partir de 2007. Vous pouvez essayer de demander s'il y a eu des mises à jour depuis. http://blogs.msdn.com/b/fyuan/archive/2007/03/10/convert-xaml-flow-document-to-xps-with-style-multiple-page-page-size-header-margin. aspx – Will

Répondre

1

Je saute votre deuxième question car elle est assez complexe pour être autonome.

J'ai fait face au même problème, mais il peut être causé par un certain nombre de choses différentes. Si le problème vient du fait que les liaisons n'ont pas encore été "déclenchées", la solution est légèrement hacky mais est facile à faire si vous contrôlez le type DataContext. Vous ajoutez simplement une méthode publique ou interne à votre type qui vous permet de déclencher des événements PropertyChanged pour chaque propriété publique. Voici un exemple:

public interface IForceBinding : INotifyPropertyChanged 
{ 
    void ForceBindings(); 
} 

public class MyDataContext : IForceBinding 
{ 
    public event PropertyChanged; 
    private string _text; 
    public string Text 
    { 
    get{return _text;} 
    set{_text = value; OnPropertyChanged("Text");} 
    } 
    public void ForceBindings() 
    { 
    OnPropertyChanged("Text"); 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
    // you know the drill 
    } 
} 

alors, vous pouvez l'utiliser ainsi:

public void Print(MyDataContext preconfiguredContext){ 
    var page = new MyWpfPage(); 
    page.DataContext = preconfiguredContext; 
    preconfiguredContext.ForceBindings(); 
    // write to xps 

Si cela ne fonctionne pas, vous pourriez être confronté à un bug où les liaisons sur la première page n'apparaissent. Je devrais creuser pendant un moment avant que je puisse trouver la solution à cela.

+0

J'ai essayé de mettre à jour les bindings via NotifyChange mais ça ne marche pas :(Toujours le même problème, j'ai l'impression que WPF ne veut pas rendre ce contrôle car il n'a pas été affiché ... – Simon

+0

@simon Voyez-vous la deuxième page? – Will

+0

@simon Je demande parce que, selon la façon dont vous faites cela, la première page peut parfois ne pas être "visible" dans le document xps. le cas ... – Will

Questions connexes