WPF — содержимое ContentControl как DrawingVisual

Можно ли установить для свойства Content объекта ContentControl объект DrawingVisual? В документации говорится, что содержимое может быть любым, но я пробовал, и ничего не появляется, когда я добавляю элемент управления на холст. Возможно ли это, и если да, можете ли вы опубликовать полный код, который добавляет ContentControl, содержимое которого является DrawingVisual, на холст?


person Alp Hancıoğlu    schedule 08.01.2011    source источник


Ответы (1)


Можно ли установить для свойства Content объекта ContentControl объект DrawingVisual?

Технически да, можно. Однако это, вероятно, не то, что вы хотите. DrawingVisual, добавленный в ContentControl, будет просто отображать строку «System.Windows.Media.DrawingVisual». Следующий код в сетке легко продемонстрирует это:

<Button>
    <DrawingVisual/>
</Button>

Чтобы правильно использовать DrawingVisual, вам необходимо инкапсулировать его в FrameworkElement. См. справочник Microsoft.

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

<Window x:Class="TestDump.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestDump"
Title="Window1" Height="300" Width="600" >
<Grid>
    <Canvas>
        <Button >
            <local:MyVisualHost Width="600" Height="300"/>
        </Button>
    </Canvas>
</Grid>
</Window>

И на стороне С#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TestDump
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }
}

public class MyVisualHost : FrameworkElement
{
    private VisualCollection _children;
    public MyVisualHost()
    {
        _children = new VisualCollection(this);
        _children.Add(CreateDrawingVisualRectangle());
    }
    // Create a DrawingVisual that contains a rectangle.
    private DrawingVisual CreateDrawingVisualRectangle()
    {
        DrawingVisual drawingVisual = new DrawingVisual();

        // Retrieve the DrawingContext in order to create new drawing content.
        DrawingContext drawingContext = drawingVisual.RenderOpen();

        // Create a rectangle and draw it in the DrawingContext.
        Rect rect = new Rect(new System.Windows.Point(160, 100), new System.Windows.Size(320, 80));
        drawingContext.DrawRectangle(System.Windows.Media.Brushes.Blue, (System.Windows.Media.Pen)null, rect);

        // Persist the drawing content.
        drawingContext.Close();

        return drawingVisual;
    }

    // Provide a required override for the VisualChildrenCount property.
    protected override int VisualChildrenCount
    {
        get { return _children.Count; }
    }

    // Provide a required override for the GetVisualChild method.
    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= _children.Count)
        {
            throw new ArgumentOutOfRangeException();
        }

        return _children[index];
    }

}
}
person Andres    schedule 08.01.2011