2010-02-23 21 views
10

मेरे डब्ल्यूपीएफ आवेदन में मेरे पास एक कैनवास है जिसमें मैं कुछ ड्राइंग करता हूं। इससे पहले मैंने पीछे कोड में ड्राइंग को संभाला था, लेकिन अब मैंने व्यूमोडेल में सबकुछ निकाल दिया है। यह मुझे कुछ चुनौतियां देता है ..बाध्यकारी डब्ल्यूपीएफ कैनवास बच्चों को एक अवलोकन करने योग्य चयन

मेरे पास स्ट्रोक रखने वाले कुछ इंकपेंटर ऑब्जेक्ट्स हैं। अब

// Build an InkPresenter: 
var someInkPresenter = BuildInkPresenter(..); 
//_myCanvas is the <Canvas> I want to display it in: 
_myCanvas.Children.Add(someInkPresenter); 

- XAML कि _myCanvas मैं इस अलग ढंग से करने की ज़रूरत धारण के कोड-पीछे में InkPresenter निर्माण नहीं: इस तरह - Earier मैं उन्हें बच्चों के रूप में कैनवास के लिए कोड में पीछे गयी। मुझे क्या करना चाहते हैं एक InkPresenter बना सकते हैं और एक संग्रह में जोड़ने के लिए है:

public ObservableCollection<InkPresenter> Drawings; 

मेरे समस्या अब यह ObservableCollection करने के लिए बाध्य करने के लिए कैनवास कैसे है - और जब संग्रह में जोड़ा InkPresenters दिखाया गया है। क्या मैं डेटा बाइंडिंग का उपयोग करके इसे किसी भी तरह से प्राप्त कर सकता हूं?

उत्तर

16

मुझे लगता है कि आप इसे ItemsControl + ItemsPanelTemplate के साथ कर सकते हैं। इस तरह:

<ItemsControl ItemsSource="{Binding YourCollection}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Canvas /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    </ItemsControl> 

इस दृष्टिकोण के बारे में अधिक पढ़ने के लिए Dr.WPF का संदर्भ लें: ItemsControl: A to Z (P is for Panel)

+0

Thx! उचित लगता है। इसे देखेंगे! – stiank81

+1

यह आम तौर पर आपके द्वारा लिया जाने वाला दृष्टिकोण है, लेकिन इस मामले में आप शायद मुद्दों में भाग ले रहे हैं क्योंकि इंकपेंटर्स कैनवास के प्रत्यक्ष बच्चे नहीं होंगे जैसे कि जब आप उन्हें कोड में जोड़ते हैं। इसके बजाय विजुअल ट्री के पास प्रत्येक इंकपेंटर आइटम के आस-पास एक अतिरिक्त सामग्री प्रस्तुतकर्ता होगा। इस विधि को काम करने के लिए आपको प्रत्येक इंकपेंटर से वास्तविक डेटा (स्ट्रोक) खींचना और अपने वीएम में उन लोगों का संग्रह संग्रहीत करना चाहिए। फिर आप एक कस्टम आइटम नियंत्रण बना सकते हैं जो एक InkPresenter को वापस करने के लिए GetContainerForItemOverride को ओवरराइड करता है। –

+0

आपके साथ जॉन से सहमत हो सकता है ... यह एक आइटम नियंत्रण है। यह UIElement का उपयोग डिफ़ॉल्ट कंटेनर के रूप में करता है ... – Anvaka

10

समाधान Anvaka सुझाव अच्छा है, लेकिन के रूप में जॉन बोवेन ने कहा आप में थोड़ा और अधिक जानने की जरूरत , यदि आप वास्तव में कैनवास संलग्न गुणों में अपने आइटम बाध्य करना चाहते हैं।

यहाँ कैसे Canvas.Left और Canvas.Top से आबद्ध होने पर एक उदाहरण है:

<ItemsControl ItemsSource="{Binding YourCollection}"> 
<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <Canvas /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 
<ItemsControl.ItemContainerStyle> 
    <Style TargetType="ContentPresenter"> 
     <Setter Property="Canvas.Left" Value="{Binding YourModelLeft}" /> 
     <Setter Property="Canvas.Top" Value="{Binding YourModelTop}" /> 
    </Style> 
</ItemsControl.ItemContainerStyle> 

Btw, मैं this question पर समाधान नहीं मिला, के बाद मैं Anvaka के सुझाव, जहां बाध्यकारी काम नहीं किया की कोशिश की ।

उम्मीद है कि यह दूसरों को समान उत्तर की तलाश में मदद करता है।

+0

धन्यवाद, बिल्कुल वही जो मैं खोज रहा था। – Cousken

संबंधित मुद्दे