Удобный способ отображения Visual в приложении WPF? - PullRequest
1 голос
/ 03 декабря 2010

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

Ответы [ 3 ]

2 голосов
/ 03 декабря 2010

Вы можете создать оболочку, которая наследует от FrameworkElement, которая будет содержать ваш Visual или универсальную оболочку, которая будет содержать любой объект, производный от Visual.

. Visual.AddVisual или, если вы хотите разместить более одного визуала, посмотрите на (частичный) пример в Использование DrawingVisual Objects

1 голос
/ 03 декабря 2010

Я не вижу способа, как вы могли бы сделать это, поскольку у Visual нет ни позиции, ни размера. Возможно, придерживаться FrameworkElement и создать стиль для него?

0 голосов
/ 04 декабря 2010

Мой (текущий) ответ - добавить его в XpsDocument и отобразить в DocumentViewer.Я мог бы, я полагаю, сделать это немного менее сложным, но у меня уже есть инфраструктура, чтобы сделать это таким образом.Это не 100%, но это работает.

Во-первых, поведение, так что я могу привязать к DocumentViewer.Document (это чертовски POCO, ург):

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, привяжите результат метода преобразования к нему через поведение, и вот оно.Я уверен, что где-то здесь есть ярлык ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...