Распечатайте документы через Wpf-control и конвертируйте в XPS

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

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

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

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


person Simon    schedule 27.09.2010    source источник
comment
Я бы настоятельно рекомендовал отказаться от этого второго вопроса, поскольку это гораздо более сложный вопрос.   -  person    schedule 27.09.2010
comment
Кстати, второй вопрос, единственное, что я когда-либо видел, приближающееся к решению этой проблемы, обсуждалось в этом сообщении блога от '07. Вы можете попробовать спросить, были ли с тех пор какие-либо обновления. blogs.msdn.com/b/fyuan/archive/2007/03/10/   -  person    schedule 27.09.2010


Ответы (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

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

person Community    schedule 27.09.2010
comment
Я пробовал обновить привязки через NotifyChange, но он не работает :( Все еще та же проблема. Похоже, WPF не хочет отображать этот элемент управления, потому что он нигде не отображался ... - person Simon; 28.09.2010
comment
@simon попробуйте добавить две страницы в документ XPS. Вы видите вторую страницу? - person ; 28.09.2010
comment
@simon Я спрашиваю, потому что, в зависимости от того, как вы это делаете, первая страница может иногда не отображаться в документе xps. Есть исправление, если это так ... - person ; 28.09.2010
comment
Прямо сейчас я использую свою собственную реализацию DocumentPaginator, и она работает почти идеально ... почти потому, что я не могу получить размер своего элемента управления (часть XPS). У меня есть UserControl. После его создания и установки DataContext я не могу понять, как проверить ActualHeight этого элемента. Прямо сейчас мне нужно отобразить каждый элемент управления в окне просмотра, проверить его размер и проверить, могу ли я разместить его на текущей или следующей странице. - person Simon; 29.09.2010