2017-02-14 68 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);