Silverlight RichTextBox / ListBox / ScrollViewer странное поведение - PullRequest
4 голосов
/ 04 октября 2011

У меня есть пользовательский элемент управления со следующим 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 опускается додно.Однако, если я удалю привязку в Run в RichTextBox и жестко закодирую текст:

<Run Text="some text"/>

Теперь полоса прокрутки остается наверху (как я и ожидал).

Это ошибка?Если нет, что происходит?Как я могу это исправить (обратите внимание: это упрощенный XAML, мне нужен ScrollViewer, потому что ListBox на самом деле находится в сетке)?

Ответы [ 6 ]

0 голосов
/ 04 апреля 2014

Спасибо большое! Вы только что спасли мне дни боли и страданий ... :)

Для тех (как я), которые задаются вопросом, как удалить scrollviewer из шаблона rtb: Извлеките шаблон со смесью. Найдите элемент scrollviewer и замените его панелью стека (сохраните атрибут x: name).

0 голосов
/ 25 октября 2012

Установите MaxHeight в окне списка, это позволит прокручивающемуся дисплею показываться только тогда, когда размеры экрана слишком малы.

0 голосов
/ 10 ноября 2011

Я наконец-то нашел решение этой проблемы. Я удалил ScrollViewer из шаблона RichTextBox.

0 голосов
/ 12 октября 2011

попробуйте установить высоту списка автоматически и установить фиксированную высоту прокрутки.таким образом, полосы прокрутки отображаются только тогда, когда высота списка больше, чем высота просмотра прокрутки.

Но, глядя на то, как определяются объекты.У тебя будет одна большая проблема в будущем.То есть в SL4 списки занимают высоту и не возвращают ее.Так что, если у вас есть что-то, что раскрывается внутри списка (например, элементы Accordion) или разрешено удаление внутри списка, список будет раскрываться, чтобы показать все его элементы.Но как только элемент удален, он никогда не вернет высоту.В результате ваша полоса прокрутки всегда будет отображаться, даже если вам больше нечего показывать внизу.

Это совершенно не соответствует теме, но я чувствовал, что должен сообщить вам.

Я надеюсьЯ помог, если не сейчас, то на будущее.

0 голосов
/ 08 октября 2011

Make it Фиксированная ширина и высота 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 голосов
/ 07 октября 2011

Я не могу сказать вам, почему 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>
...