2017-02-14 28 views
0

Я хочу создать конфигуратор продукта. Я хочу отобразить продукт в главном окне с векторной графикой xaml, а затем экспортировать файл dxf (как технический чертеж). Экспорт dxf уже работает.Разместить существующую векторную графику XAML на холсте

Основная часть изделия рисуется линиями, здесь нет проблем (рисуется как прямоугольник). Но другие установки более сложны, например, 230 В-выход. Выход является статическим, поэтому мне не нужно рисовать его с помощью кода. Я создал файл outlet.xaml с Inkscape. Как разместить этот 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 выхода. Thats мой код до сих пор:

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!"); 
    } 
} 

Edit: (выход) .xaml STECKDOSE выглядит следующим образом:

<?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);