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