2011-01-08 70 views
2

我可以将ContentControl的Content属性设置为DrawingVisual对象吗?它在文档中说,内容可以是任何东西,但我试过了,当我将控件添加到画布时什么也没有显示。是否有可能,如果是这样,你可以发布完整的代码,将一个ContentControl(其内容是一个DrawingVisual)添加到画布上吗?WPF - ContentControl内容作为DrawingVisual

回答

4

我可以将ContentControl的Content属性设置为DrawingVisual对象吗?

从技术上说,是的,你可以。但是,这可能不是你想要的。添加到ContentControl的DrawingVisual将只显示字符串“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]; 
    } 

} 
}