Печатайте документы через Wpf-контроль и конвертируйте их в XPS

Я пытаюсь преобразовать элемент управления XAML в документ XPS, но я хотел бы сделать это в пакетном режиме - отобразить элемент управления в памяти и распечатать его в XPS, не отображая его на экране. Этот проект должен работать даже без графического интерфейса.

Я прочитал статью по теме на stackru, но она не работает должным образом. Я могу создать элемент управления, установить DataContext, но вывод xps пуст. Если я отображаю элемент управления на экране, а затем печатаю его, все в порядке, но если я хочу сделать это в пакетном режиме, я получил пустой документ (были только статические метки и т. Д.)

Как я могу заставить контроль связывать элементы управления с данными?

Следующая сложная часть будет: как я могу добавить свой собственный заголовок на каждую страницу, если я распечатаю многостраничный элемент управления? (напр. список?)

1 ответ

Решение

Я пропускаю ваш второй вопрос, поскольку он достаточно сложен, чтобы быть автономным.

Я столкнулся с той же проблемой, но она может быть вызвана несколькими причинами.

Если проблема заключается в том, что привязки еще не "сработали", решение будет немного хакерским, но его легко сделать, если вы управляете типом DataContext. Вы просто добавляете открытый или внутренний метод к вашему типу, который позволяет вам запускать события PropertyChanged для каждого открытого свойства. Вот пример:

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
  }
}

тогда вы можете использовать его таким образом:

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

Если это не работает, вы можете столкнуться с ошибкой, когда привязки на первой странице никогда не отображаются. Мне придется немного покопаться, прежде чем я смогу найти решение этой проблемы.

Другие вопросы по тегам