2012-11-20 23 views
5

केवल उदाहरण मैं इस तरह एक WinRT RichTextBlock देखो करने के लिए पाठ बंधन के लिए ऑनलाइन ढूँढने में सक्षम किया गया है:मैं अपने व्यू मॉडल से RichTextBlock पर समृद्ध टेक्स्ट (FlowDocument?) कैसे बांधूं?

<RichTextBlock> 
    <Paragraph> 
     <Run Text="{Binding Content}"/> 
    </Paragraph> 
</RichTextBlock> 

केवल उदाहरण मैं वास्तव में रिच टेक्स्ट दिखा इस तरह दिखेगा के लिए ढूँढने में सक्षम किया गया है:

<RichTextBlock> 
    <Paragraph> 
     <Run>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In ligula nisi, vehicula nec eleifend vel, rutrum non dolor. Vestibulum ante ipsum primis in faucibus orci</Run> 
     <Run FontSize="30">luctus</Run> 
     <Run>et ultrices posuere cubilia Curae; Curabitur elementum scelerisque accumsan. In hac habitasse platea dictumst. Maecenas eu nibh vitae nibh laoreet placerat. Duis dolor ante, semper luctus ullamcorper eget, placerat et ligula. Donec placerat tincidunt vehicula. Fusce condimentum lacus quis libero blandit semper sed vel quam. Proin eget nisl lacinia nibh convallis scelerisque at sed massa. Duis commodo tincidunt consequat. Duis malesuada, nisl a pharetra placerat, odio dui suscipit quam, vitae rhoncus sem risus quis odio. Aliquam justo nunc, adipiscing id elementum sit amet, feugiat vel enim. Aliquam pharetra arcu nec elit luctus euismod. Suspendisse potenti.</Run> 
    </Paragraph> 
</RichTextBlock> 

मैं मेरे विचार मॉडल में एक संपत्ति है कि कई अनुच्छेदों और रन हो सकती है के लिए RichTextBlock का पाठ डेटा बाइंडिंग के बारे में कैसे जाना होगा? उस मॉडल मॉडल को देखने के लिए किस प्रकार की आवश्यकता है?

मैंने FlowDocument का उपयोग करने के कुछ संदर्भ देखे हैं, लेकिन मैं यह नहीं बता सकता कि यह RichTextBlock के साथ काम करेगा या नहीं। हालांकि, यहां तक ​​कि उन उदाहरणों में दस्तावेज़ के लिए बाध्यकारी कोई डेटा नहीं दिखता है।

+0

मैं इस अनुप्रयोग के लिए HTML/CSS/जावास्क्रिप्ट का उपयोग करने जा रहा हूँ है। एचटीएमएल/सीएसएस में टेक्स्ट डिस्प्ले बहुत आसान लगता है। विशेष रूप से जब आप एकाधिक कॉलम चाहते हैं। – CoderDennis

उत्तर

1

मैंने अपनी परियोजनाओं में से एक में RichTextBlock को डेटा बाध्य किया है। नीचे एक्सएएमएल देखें। मैं कुछ स्ट्रिंग मान और एक छवि बाध्यकारी हूँ। enter image description here

<common:RichTextColumns x:Name="richTextColumns" Margin="117,0,117,47" VerticalAlignment="Top"> 
<RichTextBlock x:Name="richTextBlock" Width="560" Style="{StaticResource ItemRichTextStyle}" TextWrapping="Wrap"> 
    <Paragraph> 
    <Run FontSize="20" FontWeight="Light" Text="{Binding Title}"/> 
    <LineBreak/> 
    </Paragraph> 
    <Paragraph LineStackingStrategy="MaxHeight"> 
    <InlineUIContainer> 
     <ItemsControl ItemsSource="{Binding Authors}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
      <StackPanel> 
       <HyperlinkButton Content="{Binding}" 
        VerticalAlignment="Center" FontSize="14" 
        Tapped="AuthorSearchLinkTapped" 
        IsTapEnabled="True" 
        Padding="0, 0, 0, 0"/> 
      </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </InlineUIContainer> 
    </Paragraph> 
    <Paragraph LineStackingStrategy="MaxHeight"> 
    <InlineUIContainer> 
     <Image x:Name="image" MaxHeight="200" Margin="0,20,0,10" Stretch="Uniform" Source="{Binding ImageUrl}"/> 
    </InlineUIContainer> 
    </Paragraph> 
    <Paragraph LineStackingStrategy="MaxHeight"> 
    <InlineUIContainer> 
     <Grid Width="560" Height="125" MaxHeight="125"> 
     <TextBlock Text="Loading ad..." 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       Style="{StaticResource BasicTextStyle}"/> 
     <UI:AdControl ApplicationId="ec6615c8-dc88-4413-af37-1fc3b5603e85" 
        AdUnitId="104236" 
        Width="250" Height="125" 
        HorizontalAlignment="Center"/> 
     </Grid> 
    </InlineUIContainer> 
    </Paragraph> 
    <Paragraph> 
    <Run FontWeight="SemiLight" Text="{Binding Description}"/> 
    </Paragraph> 
</RichTextBlock> 

<!-- Additional columns are created from this template --> 
<common:RichTextColumns.ColumnTemplate> 
    <DataTemplate> 
    <RichTextBlockOverflow Width="560" Margin="80,0,0,0"> 
     <RichTextBlockOverflow.RenderTransform> 
     <TranslateTransform X="-1" Y="4"/> 
     </RichTextBlockOverflow.RenderTransform> 
    </RichTextBlockOverflow> 
    </DataTemplate> 
</common:RichTextColumns.ColumnTemplate> 
</common:RichTextColumns> 
+0

यह अनिवार्य रूप से मेरे प्रश्न में पहले विकल्प का विस्तारित उदाहरण है। यदि आप डिज़ाइन समय पर प्रारूप जानते हैं, तो यह आसान है। लेकिन मुझे नहीं लगता कि यह उदाहरण के लिए बाध्य पाठ के भीतर मनमाने ढंग से बोल्ड शब्दों के लिए कैसे प्रदान करता है। मुझे डेटा बाध्यकारी के माध्यम से प्रदान किए जाने वाले समृद्ध स्वरूपण की आवश्यकता है, पृष्ठ XAML में प्रीसेट नहीं है। – CoderDennis

2

RichTextBlock दस्तावेज़ बाध्यकारी प्रदान करने के लिए प्रतीत नहीं होता है: आप कैसे पेज यहां प्रदान की गई हो जाता है का एक स्नैपशॉट देख सकते हैं। इसके बजाय आप इसे प्राप्त करने के लिए कस्टम RichTextBlock नियंत्रणों का उपयोग कर सकते हैं। आप Bindable RichTextBlock

+0

वह ब्लॉग पोस्ट में विस्तारित RichTextBox नियंत्रण WinRT XAML के लिए मौजूद प्रतीत नहीं होता है। – CoderDennis

+0

आईएमएचओ, इसे RichTextBox के बजाय RichTextBlock से विरासत में काम करना चाहिए। आइए हम इसके साथ अपने साहस को जानें। – Typist

+0

विंडोज 8 नियंत्रण 'RichTextBlock' को सील कर दिया गया है, इसलिए इससे विरासत एक विकल्प नहीं है। – CoderDennis

0

का प्रयास कर सकते हैं मेरी एक समान स्थिति थी। मैं कुछ चल रहे ऑपरेशन के आधार पर स्टेटस संदेशों के साथ रीडऑनली रिचटेक्स्टबॉक्स की सामग्री को अपडेट करना चाहता था।

<UserControl 
    x:Class="RawhideCsControl.StorageViewUserControl2" 
    <!-- > 

     <RichTextBox x:Name="StatusText" HorizontalAlignment="Left" Height="350.72" VerticalAlignment="Top" Width="636"> 
      <FlowDocument> 
       <Paragraph> 
        <Run Text="{Binding Status}"></Run> 
       </Paragraph> 
      </FlowDocument> 
     </RichTextBox> 

    <!-- > 
</UserControl> 

कोड:

public partial class StorageViewUserControl2 : System.Windows.Controls.UserControl 
    { 
     // . . . 

     StatusChanger statusChanger = new StatusChanger(); 
     private void AddStatusLine(string format, params object[] args) 
     { 
      if (args.Length > 0) 
       format = string.Format(format, args); 

      //m_StorageViewTreeModel.MirrorStatusDisplay += string.Format("{0}\r\n", format); 
      statusChanger.Status += string.Format("{0}\r\n", format); 

     }//end this.AddStatusLine(str) 

     // . . . 
    } // end partial class 


    public class StatusChanger : INotifyPropertyChanged 
    { 
     private string status = string.Empty; 
     public string Status 
     { 
      get { return status; } 
      set 
      { 
       status = value; 
       OnPropertyChanged("Status"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string PropertyName) 
     { 
      if(PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
     } 
    } // end class StatusChanger 
+0

मैं नहीं देख सकता कि यह मेरी समस्या को हल करता है।क्या यह आपको अपने स्टेटस संदेशों में कुछ बोल्ड टेक्स्ट और कुछ सामान्य टेक्स्ट रखने की अनुमति देता है? आप अपने उत्तर में कोई समृद्ध स्वरूपण नहीं दिखाते हैं। ऐसा लगता है कि मैंने अपने प्रश्न में जो कुछ रखा है, वह स्ट्रिंग को डेटा बाध्यकारी दिखा रहा है। – CoderDennis

1

मैं एक ही समस्या थी और मेरे समाधान मैन्युअल रूप से ऐसा करने के लिए है यहाँ मैं क्या कर समाप्त हो गया है।

  1. अपने view.xaml.cs में notifyPropertyChanged की सदस्यता लें
  2. जब कोई अद्यतन होता है, यह देखना होगा कि यह अपनी संपत्ति कि यदि ऐसा है तो
  3. अद्यतन किया गया है है, अद्यतन अपने RichTextBlock

कोड यहाँ है।

private void Page_OnLoaded(object sender, RoutedEventArgs e) 
     {  
      SetReferences(); 
      (DataContext as INotifyPropertyChanged).PropertyChanged += OnPropertyChanged; 
     } 

     private void Page_OnUnloaded(object sender, RoutedEventArgs e) 
     { 
      (DataContext as INotifyPropertyChanged).PropertyChanged -= OnPropertyChanged; 
     } 

     private void OnPropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      var propertyName = GetPropertyName<MyViewModel, object>(x => x.References); // I use this to avoid bugs at runtime 
      if (e.PropertyName == propertyName) 
       SetReferences(); 
     } 

     private void SetReferences() 
     { 
      var references = (DataContext as MyViewModel).References; 
      ReferencesRichTextBlock.Blocks.Clear(); 
      foreach (var reference in references) 
      { 
       var paragraph = new Paragraph(); 
       paragraph.Inlines.Add(new Run { Text = reference.Title, FontWeight = FontWeights.Bold}); 
       paragraph.Inlines.Add(new Run { Text = " : "}); 
       paragraph.Inlines.Add(new Run { Text = reference.Content}); 
       paragraph.Inlines.Add(new LineBreak()); 

       ReferencesRichTextBlock.Blocks.Add(paragraph); 
      } 
     } 

     public static string GetPropertyName<T, P>(Expression<Func<T, P>> action) where T : class 
     { 
      var expression = (MemberExpression)action.Body; 
      var name = expression.Member.Name; 

      return name; 
     } 

और निश्चित रूप से, इस XAML

<Page ... 
     Loaded="Page_OnLoaded" 
     Unloaded="Page_OnUnloaded"> 
... 
<RichTextBlock x:Name="ReferencesRichTextBlock"> 

          </RichTextBlock> 
</Page> 
+0

यह आशाजनक लग रहा है। मैंने कभी भी उस ऐप को पूरा नहीं किया जब मैं इस प्रश्न को पोस्ट करता था और उस पर वापस जाने की योजना नहीं बना रहा था, लेकिन संभवतः एक व्यवहार्य उत्तर के साथ मैं फिर कोशिश करूंगा। – CoderDennis