Silverlight RichTextBox / ListBox / ScrollViewer奇怪的行为

时间:2011-10-04 08:51:16

标签: silverlight listbox richtextbox scrollviewer

我有一个带有以下XAML的用户控件:

<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中删除绑定并对文本进行硬编码:

<Run Text="some text"/>

现在滚动条保持在顶部(正如我所料)。

这是一个错误吗?如果没有,发生了什么?我该如何解决这个问题(注意:这是简化的XAML,我需要ScrollViewer,因为ListBox实际上是在网格中)?

6 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

我希望它有用

答案 2 :(得分:0)

尝试将列表框的高度设置为自动并使滚动查看器高度固定。这样,滚动条仅在列表框的高度大于滚动查看器的高度时显示。

但是,看一下对象的定义方式。你将来会遇到一个大问题。也就是说,在SL4中,列表框占用高度并且不会返回。因此,如果您在列表框中有扩展内容(即Accordion项目)或允许在列表框内删除,则列表框将展开以显示其所有项目。但是一旦项目被删除,它将永远不会回报高度。结果就是您的滚动条始终显示,即使您没有更多内容显示在底部。

这完全没有话题,但我觉得我应该让你知道。

我希望,如果不是现在,我会帮助你,以及将来。

答案 3 :(得分:0)

我终于想出了解决这个问题的方法。我从RichTextBox模板中删除了ScrollViewer。

答案 4 :(得分:0)

在列表框上设置MaxHeight,这将允许滚动查看器仅在屏幕尺寸太小时显示。

答案 5 :(得分:0)

非常感谢你!你刚刚救了我几天的痛苦......:)

对于那些想知道如何从rtb模板中删除scrollviewer的人(比如我): 使用混合提取模板。 找到scrollviewer元素并将其替换为stackpanel(保留x:name属性)。