2011-10-04 64 views
4

我有以下XAML用戶控件:後面Silverlight中的RichTextBox /列表框/ ScrollViewer中奇怪的行爲

<ScrollViewer> 
    <ListBox ItemsSource="{Binding Items}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <RichTextBox> 
        <Paragraph> 
         <Run Text="{Binding}"/> 
        </Paragraph> 
       </RichTextBox> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</ScrollViewer> 

和代碼:

public partial class MainPage { 
    public MainPage() { 
     InitializeComponent(); 
     Items = new ObservableCollection<string>(Enumerable.Range(0, 100).Select(x => "some text")); 
     DataContext = this; 
    } 

    public ObservableCollection<string> Items { get; set; } 
} 

運行此代碼時,對於垂直滾動條ScrollViewer下降到底部。但是,如果我刪除了在運行中的RichTextBox和硬編碼的文本結合:

<Run Text="some text"/> 

現在滾動條停留在頂部(如我所期望的)。

這是一個錯誤?如果不是,發生了什麼事?我該如何解決這個問題(注意:這是簡化的XAML,我需要ScrollViewer,因爲ListBox實際上是在網格中)?

+0

嗨,可能是一個愚蠢的 - 但ListView可以滾動其內容w /出滾動查看器 - 如果你將你的ListView直接嵌套到網格中,它將顯示垂直滾動條,它不會滾動到底部。你也可以劫持ItemsPanel。 – 2011-10-06 15:58:27

+0

Silverlight沒有ListView控件。我懷疑即使它在模板中使用了ScrollViewer。 – JontyMC

+0

似乎對我來說是一個bug。對於它的價值,如果用一個TextBlock代替RichTextBox(並且保留{Binding}在那裏),那麼scrollviewer的行爲通常會保持在頂部。所以它是RichTextBox和展示該問題的綁定內容的組合。 –

回答

0

我終於想出瞭解決這個問題的辦法。我從RichTextBox模板中刪除了ScrollViewer。

0

我不能告訴你爲什麼ScrollViewer的行爲如此,但我會將XAML更改爲以下內容。然後是頂部的滾動條,如果你使用綁定或不在DataTemplate中。

XAML:

<ListBox ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <RichTextBox> 
     <Paragraph> 
      <Run Text="{Binding}"/> 
     </Paragraph> 
     </RichTextBox> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

是不是我在我的評論中說過的;;)另外一個不使用scrollviewer的理由是 - 它無法使用鼠標滾動按鈕。 – 2011-10-07 13:56:25

+0

我必須使用ScrollViewer,因爲我需要額外的內容(列表標題)滾動列表。我也無法使用VirtualizingStackPanel,因爲我需要平滑滾動。 – JontyMC

+0

你可以用ListView來完成這兩個操作,只需重寫ItemsPanel來將你的項目面板設置爲你需要的任何東西。 VirtualizingStackPanel :)就像我說的ScrollViewer中託管控件的主要缺點 - 你將失去鼠標滾動支持。 – 2011-10-12 08:37:08

0

讓它固定的寬度和ScrollViewer中的高度取決於網格行和列的大小。它有助於在運行時固定大小。這樣

<ScrollViewer VerticalScrollBarVisibility="Auto" VerticalAlignment="Top" HorizontalScrollBarVisibility="Auto" Width="135" Height="463"> 
<ListBox ItemsSource="{Binding Items}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical"></StackPanel> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left" Orientation="Vertical"> 
      <RichTextBox> 
      <Paragraph> 
       <Run Text="{Binding}"/> 
      </Paragraph> 
      </RichTextBox> 
     </StackPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我希望它有幫助

+0

使滾動查看器固定大小意味着滾動條根本沒有出現 – JontyMC

+0

如果列表框大小增加了滾動查看器的高度或寬度,將自動出現滾動條。如果您想要始終滾動條,請在滾動查看器中啓用VerticalScrollBarVisibility和Horizo​​ntalScrollBarVisibility。我被授予「自動」模式 –

+0

不,這沒有工作 – JontyMC

0

嘗試列表框的高度設置爲auto,使ScrollViewer中高度固定。這樣,滾動條僅在列表框的高度大於滾動查看器的高度時顯示。

但是,看着對象的定義方式。你將來會遇到一個大問題。也就是說,在SL4中,列表框佔據高度並且不會退還。因此,如果您在列表框中展開某些內容(即Accordion項目)或允許在列表框內刪除,則列表框將展開以顯示其所有項目。但是一旦一件物品被刪除,它永遠不會放棄高度。結果將是你的滾動條總是顯示,即使你沒有更多東西在底部顯示。

這是完全脫離主題,但我覺得我應該讓你知道。

我希望我幫忙,如果不是現在,那麼爲了未來。

+0

這沒有工作 – JontyMC

+0

加載後滾動條顯示嗎? – Nathan

0

在列表框上設置MaxHeight,這將允許滾動查看器僅在屏幕尺寸太小時才顯示。

0

非常感謝!你剛剛救了我幾天的痛苦和痛苦...... :)

對於那些想知道如何從rtb模板中刪除scrollviewer的人(像我一樣): 用混合提取模板。 查找scrollviewer元素並將其替換爲一個堆棧面板(保留x:name屬性)。