2010-09-05 82 views
2

我在Silverlight 4中爲RichTextBox創建了一個高亮機制。它將獲取字符位置並在文本上繪製矩形。從RichTextBox獲取滾動位置?

我現在遇到的麻煩是滾動RichTextBox。當我滾動我所有珍貴的突出顯示時,我都被拋在後面。有什麼辦法可以將事件處理程序添加到滾動事件和/或RichTextBox的滾動位置?或者有更好的方法可以將突出顯示的矩形的位置鏈接到RichTextBox?

回答

2

訣竅將得到什麼都面板(我猜它的畫布?)你是覆蓋與實際是富文本中存在相同ScrollViewer中存在的RichTextBox。

以下是非常粗糙的想法,但應該讓你走上合理解決的道路。

您可以使用RichTextBox的自定義樣式來執行此操作。該控件的默認樣式可以找到here

將此樣式複製到包含UserControl的資源中並指向您的RichTextBoxStyle屬性。到目前爲止,沒有什麼不同,但現在你可以玩模板了。有關部分目前看起來是這樣的: -

<Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent"> 
    <ScrollViewer x:Name="ContentElement" Padding="{TemplateBinding Padding}" BorderThickness="0" IsTabStop="False" /> 
</Border> 

現在我們可以調整它是這樣的: -

<Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent"> 
    <ScrollViewer Padding="{TemplateBinding Padding}" BorderThickness="0" IsTabStop="False"> 
     <Grid> 
      <ContentControl x:Name="ContentElement" /> 
      <Canvas x:Name="HighlightOverlay" /> 
     </Grid> 
    </ScrollViewer> 
</Border> 

你會注意到,我們從ScrollViewer移動的名稱「ContentElement的」到新的ContentControl。名爲「ContentElement」的FrameworkElement是RichTextBox對其模板的唯一特徵。

現在覆蓋此ContentControl我們可以放置一個Canvas您可以在其中放置突出顯示的矩形。如果用戶滾動此RichTextBox,那麼同時包含內容和亮點的整個Grid將滾動到一起。

剩下的唯一技巧是獲取「HighlightOverlay」,以便您可以將矩形添加到它。下面是一些代碼,會抓住它: -

private Canvas HightlightOverlay; 
    public MyUserControl() 
    { 
     InitializeComponent(); 
     MyRichText.LayoutUpdated += MyRichText_LayoutUpdated; 
    } 

    void MyRichText_LayoutUpdated(object sender, EventArgs e) 
    { 
     HightlightOverlay = MyRichText.Descendents() 
      .OfType<Canvas>() 
      .FirstOrDefault(elem => elem.Name == "HighlightOverlay"); 
    } 

你會想知道的Descendents方法是從哪裏來的,它是here

+0

太棒了!我正要走上一條完全不同的路徑來實際地對文本進行格式化以完成突出顯示,但這有其自身的問題。這工作得很好,最終打敗了我一直試圖破解的問題。我只需要做一些調整就可以使xaml工作,我將在下面添加它。 – 2010-09-05 21:34:51

0

Anthony W Jones想出了一個絕妙的解決方案。對我必須製作的XAML只做了一些調整。

至於建議我開始與這個模板中:

<Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent"> 
    <ScrollViewer Padding="{TemplateBinding Padding}" BorderThickness="0" IsTabStop="False"> 
     <Grid> 
      <ContentControl x:Name="ContentElement" /> 
      <Canvas x:Name="HighlightOverlay" /> 
     </Grid> 
    </ScrollViewer> 
</Border> 

但不知何故ContentControl中的事情搞砸了,你不能真正輸入到RichTextBox了。此外,滾動條沒有顯示出來。

但我發現必要做這個工作的兩個變化:

<Border x:Name="MouseOverBorder" BorderBrush="Transparent" BorderThickness="1"> 
    <ScrollViewer BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <Grid> 
      <Grid x:Name="ContentElement" /> 
      <Canvas x:Name="HighlightOverlay" /> 
     </Grid> 
    </ScrollViewer> 
</Border> 

添加HorizontalScrollBarVisibility="Auto"VerticalScrollBarVisibility="Auto"帶來的滾動條後面,並簡單地用Grid代替ContentControl取得了RichTextBox的編輯再次。

+0

奇怪的是,我已經測試過我的方法,並且這個盒子是可編輯的,但縱向滾動條即使不是必需的,也是出現了。我確實認爲它需要更多的努力才能以理想的方式運作。我很高興你能工作。 – AnthonyWJones 2010-09-05 21:51:40