2011-01-08 5 views
2

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

ответ

4

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

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

<Button> 
    <DrawingVisual/> 
</Button> 

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

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

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

А на C# стороне:

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

} 
} 
Смежные вопросы