मुझे सिल्वरलाइट 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);
क्या आप जिस प्रभाव को प्राप्त करने का प्रयास कर रहे हैं उसका एक स्क्रीनशॉट पोस्ट कर सकते हैं? शीर्ष पर xaml में कोई लिंक नहीं है, फिर भी आप अपने प्रश्न में लिंक का जिक्र करते रहते हैं। – Bryant
ब्रायंट: किसी भी वेब पेज को देखो। – Anthony