2008-12-02 6 views
6

मुझे सिल्वरलाइट 2.0 प्राप्त करने में परेशानी हो रही है, ठीक उसी तरह टेक्स्ट लिखने में मुझे परेशानी हो रही है। मैं लाइन ब्रेक और एम्बेडेड लिंक के साथ टेक्स्ट चाहता हूं, रैपिंग के साथ, वेब पेज में एचटीएमएल टेक्स्ट की तरह।सिल्वरलाइट 2.0 - टेक्स्ट रैपिंग व्यवहार नहीं मिल सकता है जो मुझे

यहाँ करीबी है कि मैं आ गए हैं:

<UserControl x:Class="FlowPanelTest.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls" 
    Width="250" Height="300"> 
    <Border BorderBrush="Black" BorderThickness="2" > 
     <Controls:WrapPanel> 
     <TextBlock x:Name="tb1" TextWrapping="Wrap">Short text. </TextBlock> 
     <TextBlock x:Name="tb2" TextWrapping="Wrap">A bit of text. </TextBlock> 
     <TextBlock x:Name="tb3" TextWrapping="Wrap">About half of a line of text.</TextBlock> 
     <TextBlock x:Name="tb4" TextWrapping="Wrap">More than half a line of longer text.</TextBlock> 
     <TextBlock x:Name="tb5" TextWrapping="Wrap">More than one line of text, so it will wrap onto the following line.</TextBlock> 
     </Controls:WrapPanel> 
     </Border> 
</UserControl> 

लेकिन मुद्दा यह है कि हालांकि पाठ ब्लॉक Tb1 और tb2 एक ही लाइन पर जाना होगा उनके लिए पर्याप्त जगह न होने के कारण पूरी तरह से, tb3 के बाद नहीं होगा पिछले ब्लॉक के समान लाइन पर शुरू करें, भले ही यह निम्नलिखित पंक्तियों पर लपेट जाए।

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


सवालों के जवाब में उत्पन्न उत्तर देने के लिए:

गैर क्लिक करने योग्य पाठ के लिए रन का उपयोग क्यों नहीं? यदि मैं केवल क्लिक करने योग्य टेक्स्ट पर अलग-अलग टेक्स्टब्लॉक का उपयोग करता हूं, तो पाठ के उन बिट्स अभी भी ऊपर वर्णित रैपिंग समस्या से पीड़ित होंगे। और लिंक से ठीक पहले टेक्स्टब्लॉक, और टेक्स्टब्लॉक के ठीक बाद। अनिवार्य रूप से यह सब। ऐसा लगता है कि मेरे पास एक ही टेक्स्टब्लॉक में एकाधिक रन लगाने के कई अवसर हैं।

RegExs और loops के साथ अन्य पाठ से लिंक को विभाजित करना समस्या नहीं है, समस्या प्रदर्शन लेआउट है।

प्रत्येक शब्द को एक व्यक्तिगत टेक्स्टब्लॉक में एक रैपपैनल में क्यों न रखें, बदसूरत हैक होने के अलावा, यह लाइनब्रेक्स के साथ बिल्कुल अच्छी तरह से नहीं खेलता है - लेआउट गलत है।

यह लिंक किए गए टेक्स्ट की अंडरलाइन शैली को टूटी हुई रेखा में भी बना देगा।

यहां प्रत्येक शब्द के साथ अपने टेक्स्टब्लॉक में एक उदाहरण दिया गया है। इसे चलाने का प्रयास करें, ध्यान दें कि लाइनबैक सही जगह पर बिल्कुल नहीं दिखाया गया है।

<UserControl x:Class="SilverlightApplication2.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls" 
    Width="300" Height="300"> 
    <Controls:WrapPanel> 
     <TextBlock TextWrapping="Wrap">Short1 </TextBlock> 
     <TextBlock TextWrapping="Wrap">Longer1 </TextBlock> 
     <TextBlock TextWrapping="Wrap">Longerest1 </TextBlock> 
     <TextBlock TextWrapping="Wrap"> 
       <Run>Break</Run> 
       <LineBreak></LineBreak> 
     </TextBlock> 
     <TextBlock TextWrapping="Wrap">Short2</TextBlock> 
     <TextBlock TextWrapping="Wrap">Longer2</TextBlock> 
     <TextBlock TextWrapping="Wrap">Longerest2</TextBlock> 
     <TextBlock TextWrapping="Wrap">Short3</TextBlock> 
     <TextBlock TextWrapping="Wrap">Longer3</TextBlock> 
     <TextBlock TextWrapping="Wrap">Longerest3</TextBlock> 
    </Controls:WrapPanel> 
</UserControl> 

LinkLabelControlhere और here के रूप में के बारे में क्या। उपर्युक्त दृष्टिकोण के समान समस्याएं हैं, क्योंकि यह वही है। नमूना चलाने का प्रयास करें, और जब तक यह लपेटता है तब तक लिंक टेक्स्ट को लंबा और लंबा बना दें। ध्यान दें कि लिंक एक नई लाइन पर शुरू होता है, जो इसे नहीं करना चाहिए। लिंक टेक्स्ट को और भी लंबा बनाएं, ताकि लिंक टेक्स्ट एक लाइन से अधिक लंबा हो। ध्यान दें कि यह बिल्कुल लपेटता नहीं है, यह कटौती करता है। यह नियंत्रण लाइन ब्रेक और पैराग्राफ ब्रेक को संभाल नहीं करता है।

क्यों सभी रन में पाठ नहीं रखा, जिसमें TextBlock पर क्लिक करता है का पता लगाने और बाहर काम जो रन क्लिक किया गया था चलाता है माउस की घटनाओं की जरूरत नहीं है, लेकिन युक्त TextBlock करता है। मुझे यह जांचने का कोई तरीका नहीं मिल रहा है कि रन माउस के नीचे है (IsMouseOver SilverLight में मौजूद नहीं है) या रन की बाउंडिंग ज्यामिति (कोई क्लिप प्रॉपर्टी) नहीं ढूंढ पा रहा है।

वहाँ

VisualTreeHelper.FindElementsInHostCoordinates()

नीचे कोड VisualTreeHelper का उपयोग करता है।क्लिक के तहत नियंत्रण प्राप्त करने के लिए FindElementsInHostCoordinates। आउटपुट टेक्स्टब्लॉक को सूचीबद्ध करता है लेकिन रन नहीं, क्योंकि रन रन यूआईएलमेंट नहीं है।

private void theText_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    // get the elements under the click 
    UIElement uiElementSender = sender as UIElement; 
    Point clickPos = e.GetPosition(uiElementSender); 
    var UiElementsUnderClick = VisualTreeHelper.FindElementsInHostCoordinates(clickPos, uiElementSender); 

    // show the controls 
    string outputText = ""; 
    foreach (var uiElement in UiElementsUnderClick) 
    { 
     outputText += uiElement.GetType().ToString() + "\n"; 
    } 
    this.outText.Text = outputText; 
} 

एक निम्न पंक्ति

मैं अभी भी इस एक के बारे में सोच रहा हूँ पर सामग्री निम्न स्थान के लिए एक मार्जिन के साथ एक खाली पाठ ब्लॉक का प्रयोग करें। निम्नलिखित पंक्ति पर निम्नलिखित सामग्री को मजबूर करने के लिए आप लाइन-ब्रेकिंग ब्लॉक के लिए सही चौड़ाई की गणना कैसे करते हैं? बहुत छोटा और निम्न सामग्री अभी भी दाईं ओर एक ही पंक्ति पर होगी। इसके बाद सामग्री के साथ, बहुत लंबी और "लाइनबैक" निम्न पंक्ति पर होगी। जब नियंत्रण का आकार बदलता है तो आपको ब्रेक का आकार बदलना होगा।

इस के लिए कोड में से कुछ है:

TextBlock lineBreak = new TextBlock(); 
    lineBreak.TextWrapping = TextWrapping.Wrap; 
    lineBreak.Text = " "; 
    // need adaptive width 
    lineBreak.Margin = new Thickness(0, 0, 200, 0); 
+0

क्या आप जिस प्रभाव को प्राप्त करने का प्रयास कर रहे हैं उसका एक स्क्रीनशॉट पोस्ट कर सकते हैं? शीर्ष पर xaml में कोई लिंक नहीं है, फिर भी आप अपने प्रश्न में लिंक का जिक्र करते रहते हैं। – Bryant

+0

ब्रायंट: किसी भी वेब पेज को देखो। – Anthony

उत्तर

0

एक बहुत ही दिलचस्प सवाल। इस प्रकार के लेआउट को संभालने के लिए आपको अपना खुद का कस्टम नियंत्रण बनाना पड़ सकता है। आप रन का उपयोग कर सकते हैं लेकिन प्रत्येक रन के शीर्ष पर एक पारदर्शी कैनवास ओवरले कर सकते हैं ताकि आप उस रन से जुड़े क्लिक ईवेंट को संभाल सकें। बिल्कुल आसान समाधान नहीं है लेकिन मुझे लगता है कि यह संभव होगा।

कृपया मुझे बताएं कि आप किसके साथ आते हैं।

+0

मुझे वाक्यांश "दिलचस्प सवाल" के बारे में बुरा लगा है। – Anthony

29

आप रन का उपयोग क्यों नहीं कर सकते?

उन सभी मूल्यों को समेकित करने के लिए रन का उपयोग करें जो 'घटनाएं नहीं होने वाले हैं, फिर जिनके ईवेंट अपने टेक्स्ट ब्लॉक में टूट जाते हैं, फिर से दोहराएं।

ऐसा लगता है कि आपको RegEx और कुछ लूपिंग के साथ ऐसा करने में सक्षम होना चाहिए। रैप पैनल पर जेसी लिबर्टी की पोस्ट देखें और देखें कि क्या यह किसी भी विचार को बढ़ावा देता है। http://silverlight.net/blogs/jesseliberty/archive/2008/12/03/the-wrap-panel.aspx

hth

+0

मैंने उपरोक्त प्रश्न में इसे संबोधित किया है। – Anthony

0

आप का उपयोग कर की कोशिश कर सकते केवल अपने TextBlock अंदर चलाता है, और पूरे TextBlock के लिए एक सिंगल क्लिक हैंडलर का उपयोग करें। हैंडलर क्लिक ईवेंट के निर्देशांक का उपयोग करके स्रोत रन का पता लगा सकता है, यह पता लगाएं कि यह एक लिंक है (प्रत्येक रन जो एक लिंक है, एक विशिष्ट एक्स: नाम हो सकता है, या आप अपना खुद का रन भी प्राप्त कर सकते हैं) और सही कार्यक्षमता का आह्वान करें वह लिंक

मैंने कभी कोशिश नहीं की है, लेकिन इस तरह से मैं समस्या को हल करने का प्रयास करूंगा।

+0

मैं ऐसा करने की कोशिश कर रहा हूं, लेकिन आप दौड़ का पता कैसे लगाते हैं? आपके पास क्लिक इवेंट के समन्वय हैं, लेकिन मुझे नहीं लगता कि रन की सीमाएं कैसे प्राप्त करें। – Anthony

0

मुझे लगता है कि ऐसा करने का सबसे अच्छा तरीका यह होगा कि प्रत्येक शब्द टेक्स्टब्लॉक होगा और फिर शब्दों को सही ईवेंट हैंडलर को विशेष अनुभागों के लिए संलग्न करें। यह आपको इच्छित रैपिंग देगा और पहले शब्द पर इंडेंटेशन के लिए, आप इसे बाएं मार्जिन सेट कर सकते हैं।

इस आलेख को उदाहरण के लिए देखें जिसमें टेक्स्ट और रैप पैनल के साथ कुछ ऐसा किया जाता है। http://jesseliberty.com/2008/12/03/the-wrap-panel/

+0

मैंने इस तकनीक का गलत उदाहरण दिया है। – Anthony

+0

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

0

जब कोई IsMouseOver प्रकार संपत्ति है, तो आप VisualTreeHelper.FindElementsInHostCoordinates() का उपयोग कर सकता है पर देखने के

+0

अच्छा विचार, मुझे उस समारोह के बारे में पता नहीं था। मैंने उपरोक्त चर्चा की है। – Anthony

0

मैं तुम्हें अपनी टिप्पणी पर टिप्पणी की जांच या नहीं कर रहे हैं क्योंकि आप नहीं था यकीन नहीं है मेरी टिप्पणियों में मैंने जो कुछ कहा है, उसे दोबारा संबोधित करें। VisualTreeHelper.FindElementsInHostCoordinates() का उपयोग करके आप रन नहीं ढूंढ सकते हैं क्योंकि यह केवल UIElements देता है और रन UIElements नहीं हैं। यदि आप इस विधि को गठबंधन करते हैं, हालांकि सुझाव के साथ किसी भी रन का उपयोग न करें तो आपको ठीक होना चाहिए?

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

+0

मेरे पास यह कोशिश करने का समय नहीं है - उपरोक्त टिप्पणियां। – Anthony

0

क्या यह काम करेगा? http://www.silverlightshow.net/items/Silverlight-LinkLabel-control.aspx

+0

नहीं। यह प्रत्येक शब्द को अपने स्वयं के टेक्स्ट ब्लॉक में डालने का एक और मामला है। प्रश्न में उल्लिखित अनुसार लाइन और पैराग्राफ ब्रेक के साथ इसमें गंभीर समस्याएं हैं। – Anthony

+0

इसके अलावा, उस नमूने में लिंक टेक्स्ट को छोटा करें "लंबे पाठ वाले लिंक इस नियंत्रण से बिल्कुल लपेटे नहीं हैं"। यह लिंक अब एक नई लाइन पर शुरू होता है जब इसे नहीं करना चाहिए। अलग-अलग शब्दों में लिंक को तोड़ने के इस छोटे से रास्ते में लपेटें। अगर लिंक रेखांकित किया गया तो कौन बुरा होगा। – Anthony

+0

या लिंक को "[link =" http: //www.silverlightshow में बदलें।नेट "लक्ष्य =" _ खाली "] त्वरित ब्राउन लोमड़ी लचीली कुत्ते पर कूद गया, जल्दी भूरा कुत्ता आलसी कुत्ते पर कूद गया [/ link]" - लिंकबटन बिल्कुल लपेट नहीं सकता है। – Anthony

0

इस प्रयास करें: http://blogs.msdn.com/delay/archive/2007/09/10/bringing-a-bit-of-html-to-silverlight-htmltextblock-makes-rich-text-display-easy.aspx

सिल्वरलाइट के लिए HtmlTextBlock। यह वास्तव में एक निश्चित अवधारणा नहीं है, लेकिन यह एक अच्छा प्रारंभिक बिंदु हो सकता है।

+0

यह एक अच्छा नियंत्रण है, और यदि लिंक क्लिक करने योग्य थे तो यह वही होगा जो मैं चाहता था। लेकिन यह सभी पाठ रनों में डालता है। और वे क्लिक करने योग्य नहीं हैं। प्रश्न में टिप्पणियां देखें। – Anthony

+0

यह स्पष्ट करने के लिए: यह वही है जो मैं चाहता था, लेकिन जब तक लिंक क्लिक करने योग्य नहीं होते हैं, तब तक यह एक "प्रारंभ बिंदु" एक श्रृंखला अंतराल बाड़ के साथ एक मृत अंत के रूप में नहीं है जिसके माध्यम से मैं गंतव्य देख सकता हूं। – Anthony

2

मैं मैं क्या पाया है अपने ही सवाल है, के आधार पर करने के लिए कुछ जवाब में डालने के लिए जा रहा हूँ:

1) आप एक प्रवाह दस्तावेज़ के साथ पूर्ण वसा डेस्कटॉप WPF में आसानी से कर सकते अनुच्छेद, हाइपरलिंक, रन और संबंधित वस्तुओं से भरा है।

यही वह है जो मैं अब कर रहा हूं, मैं सिल्वरलाइट में इस समस्या को हल करने की कोशिश नहीं कर रहा हूं।

2) सिल्वरलाइट उपयोग 4 आप Silverlight 2 या 3. हालांकि सिल्वरलाइट 4 एक RichTextArea नियंत्रण, जो जब केवल पढ़ने के लिए, इनलाइन हाइपरलिंक के साथ प्रवाह लेआउट के प्रदर्शन के इस प्रकार का समर्थन करता है है, और इसलिए कृत्यों में ऐसा नहीं कर सकते FlowDocument के एक कट-डाउन संस्करण और WPF से संबंधित कक्षाओं की तरह। सिल्वरलाइट 4 एचटीएमएल सामग्री को प्रदर्शित करने के लिए एंबेडेड वेब ब्राउज़र नियंत्रण की अनुमति देता है, अगर आप इसे विंडोज संस्करणों (यानी आईई संस्करण) और मैक और संभावित रूप से अन्य प्लेटफॉर्म पर देख सकते हैं।

3) आप शायद HTML की एक स्ट्रिंग के निर्माण और डोम में यह इंजेक्शन लगाने पेज सिल्वरलाइट नियंत्रण के बाहर के किसी के हिस्से में यह दिखाने के लिए द्वारा सिल्वरलाइट (कोई भी संस्करण) में कुछ इस तरह कर सकते हैं । यह पूरी तरह से काम करने योग्य लगता है, लेकिन मेरी राय में, आधे से भी चालाक।

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