Ищет простой, элегантный способ отображения любого данного Visual для пользователя. Единственный способ, который я могу придумать, это пощекотать его кистью и нарисовать на прямоугольнике, который находится в ScrollViewer. Не совсем лучший вариант.Удобный способ отображения Visual в приложении WPF?
ответ
Мой (текущий) ответ должен хлопнуть его в XpsDocument и отобразить его в DocumentViewer. Я мог бы, я полагаю, сделать это немного менее сложным, но у меня уже есть инфраструктура, чтобы сделать это таким образом. Его не 100%, но он работает.
Во-первых, это поведение, так что я могу связать с DocumentViewer.Document (его friggen POCO, Urgh):
public sealed class XpsDocumentBinding
{
#region Document
/// <summary>
/// The <see cref="DependencyProperty"/> for <see cref="Document"/>.
/// </summary>
public static readonly DependencyProperty DocumentProperty =
DependencyProperty.RegisterAttached(
"Document",
typeof(XpsDocument), //
typeof(XpsDocumentBinding),
new UIPropertyMetadata(null, OnDocumentChanged));
/// <summary>
/// Gets the value of the <see cref="DocumentProperty">Document attached property</see> on the given <paramref name="target"/>.
/// </summary>
/// <param name="target">The <see cref="DependencyObject">target</see> on which the property is set.</param>
public static XpsDocument GetDocument(DependencyObject target)
{
return (XpsDocument)target.GetValue(DocumentProperty);
}
/// <summary>
/// Sets the <paramref name="value"/> of the <see cref="DocumentProperty">Document attached property</see> on the given <paramref name="target"/>.
/// </summary>
/// <param name="dependencyObject">The <see cref="DependencyObject">target</see> on which the property is to be set.</param>
/// <param name="value">The value to set.</param>
public static void SetDocument(DependencyObject target, XpsDocument value)
{
target.SetValue(DocumentProperty, value);
}
/// <summary>
/// Called when Document changes.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
private static void OnDocumentChanged(object sender, DependencyPropertyChangedEventArgs e)
{
var viewer = sender as DocumentViewer;
if (viewer == null)
throw new InvalidOperationException(
"This behavior is only valid on DocumetViewers.");
var doc = e.NewValue as XpsDocument;
if (doc == null)
return;
viewer.Document = doc.GetFixedDocumentSequence();
}
#endregion
}
Тогда в моей модели я разоблачить мой визуальный как XpsDocument
var pack = PackageStore.GetPackage(_uri);
if (pack != null)
return new XpsDocument(pack, CompressionOption.SuperFast, _uri.AbsoluteUri);
MemoryStream ms = new MemoryStream(2048);
Package p = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite);
PackageStore.AddPackage(_uri, p);
XpsDocument doc = new XpsDocument(p, CompressionOption.SuperFast, _uri.AbsoluteUri);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
var collator = writer.CreateVisualsCollator();
// write the visuals using our collator
collator.BeginBatchWrite();
collator.Write(Visual);
collator.EndBatchWrite();
p.Flush();
return doc;
Просто добавьте DocumentViewer, привяжите результат метода преобразования к нему через поведение, и вот оно. Я уверен, что здесь есть ярлык ...
Я не вижу способа, как вы могли это сделать, поскольку Visual не имеет ни позиции, ни размера. Возможно, придерживайтесь FrameworkElement и создавайте для него стиль?
Вы можете создать оболочку, наследующую от FrameworkElement
, которая либо разместила бы ваш Visual
, либо общую оболочку, на которой будет размещен любой объект, полученный из Visual
.
Посмотрите на пример в Visual.AddVisual или, если вы хотите разместить более одного визуального, посмотрите на (частично), например, в Using DrawingVisual Objects
- 1. Какой самый удобный способ встраивания ссылки в приложение wpf?
- 2. Удобный способ реализации пользовательских ролей в моем приложении
- 3. Mercurial: удобный способ отображения точного количества версий файлов?
- 4. Удобный способ условного каротажа
- 5. Создание подмодели, удобный способ
- 6. Как изменить способ отображения поля в WPF?
- 7. Лучший способ отображения изображения в WPF
- 8. Удобный способ для заполнения полей в CodeIgniter
- 9. Удобный способ вставки нескольких строк?
- 10. J: Удобный способ ввода матрицы?
- 11. Удобный способ показать несколько списков
- 12. Удобный способ запуска плагина eclipse
- 13. Удобный способ очистки URL-адресов?
- 14. Изменить способ отображения элементов списка полей WPF
- 15. Более удобный способ проверки параметров?
- 16. Есть ли удобный, удобный способ получить список фактических аргументов изнутри?
- 17. Лучший способ отображения нескольких элементов данных в WPF?
- 18. более удобный способ создания структур в цикле
- 19. Угловой 2 - Удобный способ хранения в сеансе
- 20. Удобный способ найти поставщиков в Dagger2
- 21. Самый удобный способ поиска в разных столбцах
- 22. Удобный способ ввода списка в Silverlight 4?
- 23. Удобный способ хранения значений флажка в MySQL?
- 24. Удобный способ отладки for-loops в eclipse
- 25. Соответствующий способ принудительной загрузки WPF Visual
- 26. Как написать удобный MVVM-Keylistener
- 27. Значок в приложении браузера WPF
- 28. Переключатель отображения списка в WPF
- 29. Обработка ListBox в приложении wpf в visual studio
- 30. Есть ли способ отображения изображения в WPF, хранящегося в памяти?
В чем же потребность в такой низкоуровневой галстуке? – 2010-12-03 19:47:19
Это похоже на один из тех вопросов, которые помогут получить более качественное описание того, что вам действительно нужно, чтобы мы могли предоставить вам альтернативы. – Tergiver 2010-12-03 21:10:01
@Aaron @Tergiver Альтернативы не возможны. Я совмещаю визуальные эффекты для создания XpsDocuments. Я знаю их как Визуальные, хотя они могут быть чем-то, что простирается от Visual. – Will 2010-12-06 15:02:55