2014-04-10 11 views
7

सभी को नमस्कार मैं कोशिश की है योग और बुनियादी सवाल और मेरे विचार जो अब तक काम नहीं करता है के साथ आने के लिए: एसConvert पथ

मूल रूप से मेरे सवाल है: उपयोगकर्ता तत्वों को एक साथ जोड़ता है, और मैं इन आंकड़ों के आधार पर एक नया तत्व बनाना चाहता हूं, जैसे उपयोगकर्ता परिभाषित तत्व के लिए एक नया पथ बनाया जा सकता है। आइए कहें कि मेरे पास एक वर्ग और त्रिकोण है। उपयोगकर्ता इसे एक घर में जोड़ता है। अब मैं घर को उपयोगकर्ता के लिए एक तत्व बनाना चाहता हूं। इसके लिए मुझे तत्व के पथ की आवश्यकता है, मैं इसे कैसे बना सकता हूं?

मेरा विचार उपयोग किए गए आकृति तत्व पथ तारों पर आधारित होते हैं। इसलिए मैं चाहता हूं कि इन्हें एक ज्यामिति तत्व में परिवर्तित किया जाए जिसे मैं बाद में उपयोग कर सकता हूं। मैं कोड के नीचे जवाब में André Meneses द्वारा आपूर्ति का उपयोग करें, कोड यहाँ दोहराया:

public static Geometry PathMarkupToGeometry(ShieldGearViewModel shieldGearModelRec) 
    { 
     string pathMarkup = shieldGearModelRec.Gear.Path; 
     try 
     { 
      string xaml = 
      "<Path " + 
      "xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" + 
      "<Path.Data>" + pathMarkup + "</Path.Data></Path>"; 
      var path = System.Windows.Markup.XamlReader.Load(xaml) as System.Windows.Shapes.Path; 
      // Detach the PathGeometry from the Path 
      if (path != null) 
      { 
       path.Height = shieldGearModelRec.Gear.Height; 
       path.Width = shieldGearModelRec.Gear.Width; 
       path.Fill = new SolidColorBrush(Colors.Green); 
       path.Stretch = Stretch.Fill; 
       Geometry geometry = path.Data; 
       //Test not working, exception is thrown 
       //Rect transRect = new Rect(shieldGearModelRec.Gear.x, shieldGearModelRec.Gear.y, shieldGearModelRec.Gear.Width, shieldGearModelRec.Gear.Height); 
       //geometry.Transform.TransformBounds(transRect); 
       path.Data = null; 
       return geometry; 
      } 
      return null; 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
     } 
     return null; 
    } 

यह मैं एक ज्यामिति पाने के लिए this link describes से उदाहरण का अनुसरण करने से करते हैं। उपरोक्त के साथ समस्या यह है कि मैं नए ज्यामिति तत्व के एक्स या वाई पदों तक नहीं पहुंच सकता, तो मैं इस स्थिति को कैसे निर्दिष्ट करूं?

मुझे लगता है कि स्थिति के लिए this link एक समाधान हो सकता है, अभी तक इसे अभी तक काम नहीं मिला है? :)

जब यह किया जाता है तो मैं इसे पहले लिंक के आधार पर एक ज्यामिति समूह में जोड़ता हूं, जैसे कि मैं नए तत्व के लिए पथ प्राप्त कर सकता हूं। लेकिन ज्यामिति समूह में सीमा के रूप में 0 है। तो इस काम के लिए मुझे व्यक्तिगत ज्यामिति तत्वों के लिए एक्स और वाई को परिभाषित करने की आवश्यकता है, और फिर यह geomtrygroup समस्या को हल कर सकता है या फिर मुझे इसे देखना होगा :) प्रश्न बहुत लंबे समय तक खड़ा रहा है: |

पाठ के नीचे पुराने प्रश्न और विचारों

मैं एक स्ट्रिंग है कि मैं कोड में एक ज्यामितीय आकार में कन्वर्ट करने के पीछे चाहते हैं है। इसलिए मैं Stackoverflow WPF C# Path: How to get from a string with Path Data to Geometry in Code (not in XAML) पर इस पाया

यह लिंक पता चलता है कि एक निम्न कोड के साथ पार्स का उपयोग कर पथ के लिए एक स्ट्रिंग परिवर्तित कर सकते हैं:

var path = new Path(); 
path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 400,175 H 280"); 

हालांकि पार्स विंडोज फोन पर उपलब्ध नहीं है। मेरे अन्य प्रयासों ने इस मुद्दे को हल नहीं किया है। मैंने पथ जीमेट्री के साथ कोशिश की लेकिन पथ के रूप में एक स्ट्रिंग सेट करना संभव नहीं था?

तो मेरी समस्या यह है कि स्ट्रिंग को किसी तत्व पर बाध्यकारी न होने के पीछे कोड में एक ज्यामितीय आकार में परिवर्तित करने का तरीका है।

प्रथम चरण तो मैं निम्नलिखित

var pathTesting = new System.Windows.Shapes.Path(); 
var b = new System.Windows.Data.Binding 
{ 
    Source = DecorationOnShield[i].Gear.Path 
}; 
System.Windows.Data.BindingOperations.SetBinding(pathTesting, System.Windows.Shapes.Path.DataProperty, b); 

के साथ एक पथ बनाने अब मैं एक ज्यामितीय आकार के लिए पथ परिवर्तित करने के लिए कोशिश कर रहा हूँ में सफल रहा।

अतिरिक्त

मेरा विचार this link describes के रूप में ही करना है।कहाँ उदाहरण दिखाता है:

var blackRectGeometry = new RectangleGeometry(); 
Rect rct = new Rect(); 
rct.X = 80; 
rct.Y = 167; 
rct.Width = 150; 
rct.Height = 30; 
blackRectGeometry.Rect = rct; 

लेकिन आयत के बजाय मैं एक पैट ज के रूप में एक मनमाने आकार का उपयोग करें, लेकिन अभी भी जानकारी सेट करने जैसे निर्देशांक और आकार में सक्षम होना चाहते हैं

अतिरिक्त

मैं एक usercontrol जो केवल इस तरह लग रही एक पथ शामिल परिभाषित करने की सोच रहा था:

<UserControl x:Class="UndoRedoShield.View.Geometry" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WP8" 
mc:Ignorable="d" 
Canvas.Left="{Binding Gear.x}" Canvas.Top="{Binding Gear.y}"> 


<Path Data="{Binding Gear.Path}" Fill="{Binding Gear.Color}" Stretch="Fill" UseLayoutRounding="False" Height="{Binding Gear.Height}" Width="{Binding Gear.Width}" Opacity="{Binding Gear.Opacity}"> 
    <Path.RenderTransform> 
     <ScaleTransform ScaleX="{Binding Gear.Scale}" ScaleY="{Binding Gear.Scale}"/> 
    </Path.RenderTransform> 

</Path> 

</UserControl> 

लेकिन ज्यामिति के बारे में किसी भी तरह से इसका इस्तेमाल करने में सक्षम है। किसी को भी इस विधि का उपयोग कर कोई विचार है? किसी भी विधि की सराहना की है! :)

अतिरिक्त अतिरिक्त :)

यह, uielements से बाहर एक ज्यामितीय आकार बनाने के लिए संभव है ऐसी है कि एक usercontrol कि प्रदान की गई है एक ज्यामितीय पथ के लिए परिवर्तित किया जा सकता है?

प्रगति

मैं this link मैं एक मार्ग से एक ज्यामिति कहाँ बना सकते हैं पाया। पथ में संपत्ति चौड़ाई और ऊंचाई है।

लेकिन गुण मैं ज्यामिति या रास्ते में नहीं है निम्नलिखित है:

  1. Canvas.Left
  2. Canvas.Top
  3. Canvas.ZIndex (मुझे लगता है कि यह संभव है जब मैं इसे जोड़ने एक ज्यामिति समूह में)

ऐसा लगता है कि यह पथ की सीमाओं के माध्यम से किया जा सकता है। डेटा। लेकिन ज़िन्डेक्स नहीं। इसलिए इसे अभी भी ज्यामिति समूह के साथ परीक्षण करने की आवश्यकता है, और ज्यामिति को ज्यामिति समूह में जोड़ा जाना आवश्यक है।

+1

[एमएसडीएन] (http://msdn.microsoft.com/en-us/library/system.windows.media.geometry.parse%28v=vs.110%29.aspx) को समेकित करना 'ज्यामिति। पर्स' इन प्लेटफार्मों पर इस्तेमाल किया जा सकता है: विंडोज फोन 8.1, विंडोज फोन 8. विंडोज फोन का कौन सा संस्करण आप विकसित कर रहे हैं? –

+0

विंडोज फोन 8, शायद बाद की तारीख में विंडोज फोन 8.1 में अपग्रेड हो जाएगा। तो ज्यामिति। पर्स काम नहीं करता है? – JTIM

+1

काम करने से आपका क्या मतलब है? आपका प्रोजेक्ट प्रकार और संस्करण इसका समर्थन नहीं करता है या पार्स विधि को कॉल करके आपको उचित परिणाम नहीं मिलता है? –

उत्तर

3

Geometry.Parse (और जहाँ तक मैं बता सकता हूँ, यह पीछे के अंत StreamGeometry है) वास्तव में विंडोज फोन मंच से याद आ रही है, लेकिन इस पृष्ठ के अनुसार: http://msdn.microsoft.com/en-us/library/ms752293(v=vs.110).aspx

WPF दो वर्गों है कि प्रदान प्रदान करता है ज्यामितीय पथ का वर्णन करने के लिए मिनी-भाषाएं: स्ट्रीमगोमेट्री और पथफिगर चयन।

PathFigureCollection विंडोज फोन के लिए उपलब्ध है, तो यह जाँच करने के लिए जगह की तरह दिखता है:

http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.media.pathfigure(v=vs.105).aspx

अब तुम सिर्फ XAML शैली मार्कअप से PathGeometry बनाने में सक्षम होने की जरूरत है।ऐसा लगता है कि उदाहरण XAML वाक्य रचना से एक पथ पैदा करने के लिए यहाँ देखते हैं जैसे: कुछ समय पहले

Convert XAML PathGeometry to WPF PathGeometry

Windows Phone 7: How to parse Bezier Path string like in XAML?

मूल रूप से

string data = "M 100,200 C 100,25 400,350 400,175 H 280"; 
Path path = XamlReader.Load("<Path Data='" + data + "'/>") as Path; 
+0

धन्यवाद। शायद यह रास्ता बनाने के लिए एक बेहतर तरीका है। लेकिन ज्यामिति बनाने के संबंध में, मुझे स्थिति के रूप में सभी प्रकार के चर सेट करने में सक्षम बनाता है। चूंकि मैं अब इसका परीक्षण नहीं कर सकता, आप कहते हैं कि यह pathfigurecollection या pathgeometry के साथ संभव है? – JTIM

+1

आपको कुछ भी सेट करने में सक्षम होना चाहिए जिसे आप XAML के माध्यम से सेट करने में सक्षम होंगे। इस तकनीक के साथ मुख्य प्रतिबंध यह प्रतीत होता है कि आप इसे बनाए जाने के बाद पथ को संपादित/परिवर्तित नहीं कर सकते हैं। –

+0

अंत में इसका परीक्षण करने का समय था। और काम नहीं लग रहा है। आपके द्वारा संदर्भित लिंक यह प्रतीत होता है कि आपके पास xaml कोड तक पहुंच है, और जिस तरह से आप संदर्भित करते हैं, लेकिन मैं xaml कोड निर्दिष्ट नहीं करना चाहता हूं। मेरे प्रश्न में दिखाए गए पहले चरण में एक रास्ता मिलता है जिसे मैं सिस्टम के एक चर से बांधता हूं। Windows.Shapes.Path। इसके साथ मैं एक आकृति या ज्यामिति बनाना चाहता हूं। लेकिन आपके सुझावों और समाधानों के साथ संभव नहीं है। – JTIM

7

की तरह कुछ है, जबकि के लिए एक समाधान के लिए खोज यह और मैं इस समारोह को बनाने के समाप्त हो गया। शायद यह आपकी मदद करेगा।

 var arrow = new Path 
    { 
     Data = DesignHelpers.PathMarkupToGeometry("M-1,0 L0,1 L1,0"), 
     Fill = new SolidColorBrush(Colors.Black), 
     Stretch = Stretch.Fill, 
     Height = 12, 
     Width = 18, 
     HorizontalAlignment = HorizontalAlignment.Center 
    }; 

मैं अगर यह वास्तव में अपनी आवश्यकताओं फिट होगा पता नहीं है लेकिन शायद यह मदद कर सकते हैं:

public static Geometry PathMarkupToGeometry(string pathMarkup) 
    { 
     try 
     { 
      string xaml = 
      "<Path " + 
      "xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" + 
      "<Path.Data>" + pathMarkup + "</Path.Data></Path>"; 
      var path = XamlReader.Load(xaml) as Path; 
      // Detach the PathGeometry from the Path 
      if (path != null) 
      { 
       Geometry geometry = path.Data; 
       path.Data = null; 
       return geometry; 
      } 
      return null; 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
     } 
     return null; 
    } 

तो मैं इस तरह इस फ़ंक्शन को कॉल करें।

+0

धन्यवाद, मैं आज रात परीक्षण करूँगा – JTIM

+0

मैं अभी भी आपके द्वारा प्रदान किए गए कोड का परीक्षण कर रहा हूं, और ऐसा लगता है। हालांकि मुझे तत्व की एक्स, वाई और जेड स्थिति निर्दिष्ट करने की भी आवश्यकता है। आम तौर पर कैनवास गुणों के साथ किया जाता है। क्या आपके पास इसे नियंत्रित करने का विचार है? एक्स और वाई गुण सीमाओं की संपत्ति में उपलब्ध हैं लेकिन मेरा डीबगर कहता है कि वे केवल मूल्यों को वापस कर रहे हैं। – JTIM

+0

बाद तीर तत्व घोषित किया जाता है, तो आपको निम्न कर सकते हैं: 'Canvas.SetTop (तीर, 10);' ' Canvas.SetLeft (तीर, 20);' ' Canvas.SetZIndex (तीर, 30); ' और फिर आपको तीर तत्व को काम करने के लिए कैनवास में रखना होगा, जाहिर है ... – Meneses