【问题标题】:Silverlight RichTextBox/ListBox/ScrollViewer strange behaviourSilverlight RichTextBox/ListBox/ScrollViewer 奇怪的行为
【发布时间】:2011-11-30 12:23:15
【问题描述】:

我有一个带有以下 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 实际上是在一个网格中)?

【问题讨论】:

  • 嗨,可能有点傻 - 但 ListView 可以在没有滚动查看器的情况下滚动其内容 - 如果您将 ListView 直接嵌套到网格中,它将显示垂直滚动条并且不会滚动至底部。你也可以劫持 ItemsPanel。
  • Silverlight 没有 ListView 控件。我怀疑即使这样做也会在模板中使用 ScrollViewer。
  • 对我来说似乎是一个错误。对于它的价值,如果您将 RichTextBox 替换为 TextBlock(并将 {Binding} 保留在其中),则滚动查看器会正常运行并保持在顶部。因此,出现问题的是 RichTextBox 和绑定内容的组合。
  • 我还尝试摆脱滚动查看器并使用 StackPanel(而不是 VirtualizingStackPanel)覆盖 ItemsPanelTemplate,结果是完全相同的行为 - 绑定时滚动到底部。跨度>

标签: silverlight listbox richtextbox scrollviewer


【解决方案1】:

我无法告诉您为什么 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>

【讨论】:

  • 这不是我在评论中所说的吗?;)反对不使用滚动查看器的另一个论点是 - 它使得无法使用鼠标滚动按钮。
  • 我必须使用 ScrollViewer,因为我需要额外的内容(列表标题)来滚动列表。我也不能使用 VirtualizingStackPanel,因为我需要平滑滚动。
  • 你可以同时使用 ListView,只需覆盖 ItemsPanel 将你的项目面板设置为你需要的任何东西,包括。 VirtualizingStackPanel :) 就像我说的那样,在 ScrollViewer 中托管控件的主要缺点 - 您将失去鼠标滚动支持。
  • 我不明白您所说的 ScrollViewer 中托管控件的缺点是什么意思。 ListBox 默认模板使用 ScrollViewer。 Silverlight 中不存在 ListView。
【解决方案2】:

使其滚动查看器的固定宽度和高度取决于网格行和列的大小。它有助于在运行时固定大小。像这样

<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>

希望对你有帮助

【讨论】:

  • 使 ScrollViewer 固定大小意味着滚动条根本没有出现
  • 如果列表框大小增加更多,滚动查看器的高度或宽度将自动出现滚动条。如果您想要始终滚动条,请在滚动查看器中启用 VerticalScrollBarVisibility 和 Horizo​​ntalScrollBarVisibility。我被赋予了“自动”模式
【解决方案3】:

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

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

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

我希望我能有所帮助,如果不是现在,那么是为了未来。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        对于那些(像我一样)想知道如何从 rtb 模板中删除滚动查看器的人: 使用 blend 提取模板。 找到 scrollviewer 元素并将其替换为 stackpanel(保留 x:name 属性)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-05
          • 1970-01-01
          • 1970-01-01
          • 2011-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多