2017-02-14 32 views
0

我想制作产品配置器。我想用xaml矢量图形在主窗口中显示产品,然后导出一个dxf文件(作为技术图纸).dxf导出已可用。将现有的XAML矢量图形放入画布中

产物的主要部分drawed用线,在这里没有问题(drawed为矩形)。但其他安装更复杂,例如230V插座。插座是静态的,所以我不需要用代码绘制它。我用Inkscape创建了一个outlet.xaml文件。如何将该xaml文件放置在画布上的特定位置(坐标)上?

在DXF是很容易 - 我创建了一个块作为外部DXF文件,我可以像这样的图形中插入:

DxfDocument doc = new DxfDocument(); 
doc.DrawingVariables.InsUnits = DrawingUnits.Millimeters; 

//Insert existing DXF 
netDxf.Blocks.Block Steckdose = netDxf.Blocks.Block.Load("Steckdose.dxf"); 
Insert i = new Insert(Steckdose, new Vector2(200,200)); 
doc.AddEntity(i);   
doc.Save("test.dxf"); 

有没有办法做到这一点使用XAML?请注意:网点的数量和位置应该是可变的,所以我想用c#代码来绘制它们。

为了测试,我制作了一个带两个文本框的窗口:一个用于矩形的一个,一个用于插座的x坐标。 那是到目前为止我的代码:

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    int value1; 
    int value2; 
    if (int.TryParse(txt_laenge.Text, out value1) & int.TryParse(txt_laenge.Text, out value2)) 
    { 
     Länge = value1; 
     int SD = value2; 
     var rechteck = new System.Windows.Shapes.Rectangle(); 
     rechteck.Stroke = new SolidColorBrush(Colors.Black); 
     rechteck.Height = 136; 
     rechteck.Width = Länge; 
     Canvas.SetLeft(rechteck,0); 
     Canvas.SetTop(rechteck, 0); 
     IV.Children.Clear(); 
     IV.Children.Add(rechteck); 
     //Place Steckdose.xaml at coordinates (SD, 68); 
    } 
    else 
    { 
     MessageBox.Show("Ungültige Eingabe!"); 
    } 
} 

编辑:Steckdose(出口)的.xaml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?> 
<!--This file is NOT compatible with Silverlight--> 
<Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stretch="Uniform"> 
    <Canvas Name="svg8" Width="44" Height="44"> 
    <Canvas.RenderTransform> 
     <TranslateTransform X="0" Y="0"/> 
    </Canvas.RenderTransform> 
    <Canvas.Resources/> 
    <!--Unknown tag: sodipodi:namedview--> 
    <!--Unknown tag: metadata--> 
    <Canvas Name="layer1"> 
     <Canvas.RenderTransform> 
     <TranslateTransform X="0" Y="-253"/> 
     </Canvas.RenderTransform> 
     <Rectangle xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="0.13150091" Canvas.Top="253.1315" Width="43.737" Height="43.737" RadiusX="4.4731021" RadiusY="4.4731021" Name="rect3680" Fill="#FF008000" StrokeThickness="0.26300183" Stroke="#FF000000"/> 
     <Ellipse xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="2.7" Width="38.6" Canvas.Top="255.7" Height="38.6" Name="path4487" Fill="#FF008000" StrokeThickness="0.35593221" Stroke="#FF000000"/> 
     <Ellipse xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="9.7" Width="4.6" Canvas.Top="272.7" Height="4.6" Name="path4491" Fill="#FF000000" StrokeThickness="0.36692113" Stroke="#FF000000"/> 
     <Ellipse xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="29.7" Width="4.6" Canvas.Top="272.7" Height="4.6" Name="path44915" Fill="#FF000000" StrokeThickness="0.36692113" Stroke="#FF000000"/> 
    </Canvas> 
    </Canvas> 
</Viewbox> 
+0

取决于确切的对象类型包含在outlet.xaml中。您可以使用'XamlReader.Load()'加载XAML,并将返回值转换为适当的类型。然后将加载的对象添加到您的画布。 – Clemens

+0

你不能创建一个UserControl并使用生成的Xaml? – Ron

回答

0

这应该工作:

UIElement element; 

using (var stream = new FileStream("Outlet.xaml", FileMode.Open, FileAccess.Read)) 
{ 
    element = (UIElement)XamlReader.Load(stream); 
} 

Canvas.SetLeft(element, 100); 
Canvas.SetLeft(element, 50); 
canvas.Children.Add(element);