2009-04-07 19 views
9

में छवियां प्रदर्शित करें मैं एक साधारण चैट एप्लिकेशन पर काम कर रहा हूं।टेक्स्टब्लॉक (WPF)

<ListBox ItemsSource="{Binding MessageCollection}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

अब मैं छवियों डाल करने के लिए सक्षम होने के लिए चाहते हैं (चित्रमय स्माइली की तरह) दिखाया गया संदेश पाठ में: वर्तमान में संदेशों के लिए एक कस्टम स्टाइल इस (सरलीकृत XAML) की तरह लिस्टबॉक्स से आबद्ध कर रहे हैं। क्या टेक्स्टब्लॉक (या कोई अन्य स्टैंडअर्ट घटक) का उपयोग करके इसे हासिल करने का कोई तरीका है या क्या मुझे इसके लिए कुछ विशेष नियंत्रण उपयोग करने की आवश्यकता है?

अग्रिम धन्यवाद

उत्तर

1

आप छवियाँ वास्तव में पाठ (कोई इमोटिकॉन) की तरह अंदर चाहते हैं, तो आप कुछ काम करना करने के लिए जा रहे हैं। ऐसा लगता है कि मैं वास्तव में उपयोगकर्ता नियंत्रण चाहता हूं, जिस बिंदु पर मैं इमोटिकॉन मूल्यों को ढूंढने और फ्लाई पर डेटा टेम्पलेट बनाने के लिए पाठ स्कैन करता हूं।

याद रखें कि कुछ भी आप XAML में कर सकते हैं आप कोड में कर सकते हैं, तो कोड मैं सोच रहा हूँ यह सामान्य विचार का पालन करेगा:

  1. इमोटिकॉन मूल्यों के लिए स्कैन पाठ और मूल्यों की एक सूची बना डेटा तत्वों के लिए।
  2. एक डॉकपैन बनाएं।
  3. सूची में Foreach element, या तो टेक्स्टब्लॉक या एक छवि (मान के आधार पर) जोड़ें।
  4. इसे सेट करें। डॉकपैनल से संपर्क करें।

मुझे लगता है कि ऐसा कुछ वास्तव में आप जो खोज रहे हैं, लेकिन यदि आप केवल एक छवि चाहते हैं, तो ValueConverter सुझाव काम करेगा।

+0

मुझे यह पसंद, बहुत सरल लगता है। लेकिन मैं टेक्स्टव्रपिंग के बारे में चिंतित हूं ... मैं इसे लागू करने की कोशिश करूंगा और देख सकता हूं कि यह कैसे काम करता है। धन्यवाद। – lacop

+0

यह एक अच्छा मुद्दा है। सही रैपिंग प्रभाव प्राप्त करने के लिए आपको आवश्यकतानुसार कुछ मापने और पाठ को तोड़ने की आवश्यकता हो सकती है। यह केवल एक मुद्दा होना चाहिए जब एक इमोटिकॉन मौजूद होता है। –

+0

वैसे भी, मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है। मैंने कस्टम उपयोगकर्ता नियंत्रण बनाया है लेकिन मुझे नहीं पता कि प्रतिपादन तंत्र को ओवरराइड कैसे करें और आवश्यकतानुसार टेक्स्टबॉक्स/छवि तत्वों को उत्सर्जित करने के मेरे कोड के साथ इसे प्रतिस्थापित करें। क्या आप मुझे एक संकेत दे सकते हैं? – lacop

1

में आप एक मूल्य कनवर्टर इस्तेमाल कर सकते हैं एक और प्रकार है जो खंडों जो या तो पाठ या स्माइली चेहरा (जिस क्रम में वे दिखाई देते हैं में) से बने होते हैं की एक सूची है करने के लिए पाठ परिवर्तित करने के लिए।

फिर, आप उस नए प्रकार से जुड़ने के लिए डेटा टेम्पलेट का उपयोग कर सकते हैं और टेक्स्ट और स्माइली चेहरे को उचित रूप से प्रदर्शित कर सकते हैं।

+0

क्या आप दूसरे भाग को थोड़ा और समझा सकते हैं (या सिर्फ मुझे दस्तावेज़/नमूना से लिंक करें)। मुझे लगता है कि मैं पहले भाग को समझता हूं लेकिन यह नहीं जानता कि विभिन्न तत्वों के लिए दो अलग-अलग डेटा प्रकारों को कैसे मैप करना है। – lacop

-1

टेक्स्टब्लॉक के बजाय छवि तत्व का उपयोग करें और पाठ मूल्य को मुस्कान छवि पर मैप करने के लिए कनवर्टर का उपयोग करें।

<ListBox ItemsSource="{Binding MessageCollection}"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Image Source="{Binding Text, Converter={StaticResource MyImageConverter}}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

+0

लेकिन यह केवल संदेश में एक छवि की अनुमति देगा, है ना? मैं जो चाहता हूं वह एक संदेश में पाठ और छवियों का संयोजन है। – lacop

+0

डेटाटेम्प्लेस आप जो कुछ भी चाहते हैं वह हो सकता है। उदाहरण के लिए <... अन्य नियंत्रण ...> ema

3

टेक्स्टब्लॉक की सामग्री हमेशा इनलाइनों की एक श्रृंखला होती है, इसलिए आपको इनलाइनयूकॉन्टेनर का उपयोग करना चाहिए। आप इस कंटेनर को अपने टेक्स्टब्लॉक में इनलाइनों में से एक के रूप में सम्मिलित कर सकते हैं, जहां भी आप एक छवि दिखाना चाहते हैं, टेक्स्ट रन के साथ बदलना। आप एक संदेश को पार्स कर सकते हैं और साथ ही टेक्स्टबॉक के इनलाइन संग्रह में टोकन (या तो टेक्स्ट या छवियां) जोड़ना जारी रख सकते हैं।

31

बस इनलाइनयूकॉन्टेनर का उपयोग करें।

<TextBlock TextWrapping="Wrap"> 
    <Run>Some text.</Run> 
    <InlineUIContainer> 
     <Image Source="http://sstatic.net/stackoverflow/img/apple-touch-icon.png" Height="20"></Image> 
    </InlineUIContainer> 
    <Run>Some more text.</Run> 
</TextBlock> 
1

मैं भी हाल ही में इस समस्या हुई है और मैं द्वारा

इस पर काबू पाने ItemTemplate एक ListBox बनाना एक ItemsControl कि ItemsPanelTemplate में एक WrapPanel है युक्त और फिर साथ ItemsControl की ItemsSource करने के लिए अपने स्ट्रिंग बाध्यकारी एक IValue कनवर्टर जिसमें सभी तर्क हैं।

अपने शब्दों को विभाजित करें और अपने इमोटिकॉन्स तार, हाइपरलिंक इत्यादि को खोजें/अपनी टेक्स्टब्लॉक, छवि, हाइपरलिंक, बटन तत्व बनाएं और अपने मूल्यों और ईवेंट हैंडल सेट करें।

फ़ंक्शन में एक सूची < UIElement> बनाएं और आपके द्वारा जेनरेट किए गए नियंत्रणों के साथ सूची को पॉप्युलेट करें और सूची को IValueConverter के कनवर्ट फ़ंक्शन में ऑब्जेक्ट के रूप में वापस करें।

क्योंकि आपके पास वहां रैपपैनल है, तो आप अपना रैपिंग पूरा कर लेते हैं।

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