4

検索結果ボックスとして使用されているSilverlightリストボックスがあります。動的検索を使用しています(検索ボックスのキーアップにより、イベントが発生し、このリストボックスの内容がフィルタリングされます)。私が直面している問題は、ボックスがフィルタリングされていないときにユーザーが下にスクロールしてから検索を行う場合、リストボックスを再バインドしてもスクロールが一番上に戻らず、結果が1つしかないように見えることです。その中の値。

私がこれまでにリストボックス用に持っているコードはこれです(これは簡略化されたバージョンです):

XAML:

<Grid x:Name="MainGrid" Rows="2">
    <StackPanel Orientation="Horizontal" Grid.Row="0">
         <TextBlock text="Search" Grid.Row="0" />
         <Textbox x:name="textboxSearch" Keyup="textBoxSearch_KeyUp" width="200" 
                  Height="25"/>
    </StackPanel>
    <ListBox x:Name="SearchResultBox" Visibility="Visible" Grid.Row="1"
             ScrollViewer.HorizontalScrollBarVisibility="Auto"
             ScrollViewer.VerticalscrollbarVisibility="Auto">
         <ListBox.ItemTemplate>
              <DataTemplate>
                   <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding ReportName}" />
                        <TextBlock Text="{Binding ReportDescription}" />
                   </StackPanel>
              </DataTemplate>
         </Listbox.ItemTemplate>
    </ListBox>
</Grid>

VB:

Imports System.Threading
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Partial Public Class ucSearch
     Inherits UserControl
     Private WithEvents BGwork As New BackgroundWorker()
     Private mReportList as New List(Of cFilter)

     Public Sub New()
          InitializeComponent()
          FillReportList()
          NewFilterList()
     End Sub

     Private Sub FillReportList()
          mReportList.Add(new cFilter("Report A", "Report A desc")
          mReportList.Add(new cFilter("Report B", "Report B desc")
          mReportList.Add(new cFilter("Report C", "Report C desc")
          mReportList.Add(new cFilter("Report D", "Report D desc")
          mReportList.Add(new cFilter("Report E", "Report E desc")
          mReportList.Add(new cFilter("Report F", "Report F desc")
          mReportList.Add(new cFilter("Report G", "Report G desc")
          mReportList.Add(new cFilter("Report H", "Report H desc")
          mReportList.Add(new cFilter("Report I", "Report I desc")
          mReportList.Add(new cFilter("Report J", "Report J desc")
          mReportList.Add(new cFilter("Report K", "Report K desc")
          mReportList.Add(new cFilter("Report L", "Report L desc")
          mReportList.Add(new cFilter("Report M", "Report M desc")
     End Sub

     Private Sub textboxSearch_KeyUp(ByVal sender as System.Object, _
                                     ByVal e as System.Windows.Input.KeyeventArgs)
         NewFilterList()
     End Sub

     Private Sub NewFilterList()
          If BGwork.IsBusy Then
               If Not BGWork.cancellationPending Then BGwork.CancelAsync()
               Exit Sub
          End If

          With BGwork
               .WorkerSupportsCancellation = True
               .RunWorkerAsync(textboxSearch.Text)
          End With
     End Sub

     Private Sub BGwork_DoWork(ByVal sender as Object, _
                               ByVal e as System.ComponentModel.DoWorkEventArgs) _
                               Handles BGwork.DoWork
          Dim Filtered as New List(of cFilter)
          If textboxSearch.Text.Length > 0
               dim q = FROM ri In mReportList Where ri.Reportname.ToLower.contains(textboxSearch.Text.ToLower) Select ri
               Filtered = q
          Else
               Filtered = mReportList
          End If
          Dim RTN as List(Of cFilter) = Filtered
          e.Cancel = False
          e.Result = RTN
     End Sub

     Private Sub BGwork_RunWorkerCompleted(ByVal sender As Object_
                                           ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
                                           Handles BGwork.RunWorkerCompleted
          If e.Cancelled Then
               NewFilterList()
               Exit Sub
          End If

          Dim RTN as cFilter = TryCast(e.Result, cFilter)
          If IsNothing(RTN) Then Exit Sub

          SearchResultBox.ItemsSource = RTN
          SearchResultBox.InvalidateArrange()
     End Sub
 End Class

 Public Class cFilter
      Inherits BaseDataClass
      Private mReportName as String = ""
      Private mReportDescription as String = ""

      Public Sub New()
           mReportName = ""
           mReportDescription = ""
      End Sub

      Public Sub New(ByVal reportName as String, ByVal reportDescription as String)
           mReportName = reportName
           mReportDescription = reportDescription
      End Sub

      Public Property ReportName() as String
           Get
                Return mReportName
           End Get
           Set(ByVal value as String)
                mReportName = value
           End Set
      End Property

      Public Property ReportDescription() as String
           Get
                Return mReportDescription
           End Get
           Set(ByVal value as String)
                mReportDescription = value
           End Set
      End Property
 End Class

繰り返しますが、これは何が起こっているかから大幅に単純化されています(データベースにアクセスしてレポート名などを取得します)。リストボックスを再バインドするときに、リストの一番上に最初の項目が表示されるようにリストボックスを完全にスクロールするにはどうすればよいですか?ListBoxオブジェクト内からscrollviewerコントロールにアクセスできないので、リストボックスを囲むscrollviewerコントロールを作成して、そこからのビューの場所を設定する必要がありますか?

4

2 に答える 2

6

この投稿を見た後

Silverlightリストボックスでの自動スクロール

私は次のことを試しましたが、うまくいきました。

 theListBox.ItemsSource = data;
 theListBox.UpdateLayout();
 theListBox.ScrollIntoView(theListBox.Items[0]);
于 2009-12-04T05:58:57.933 に答える
0

試しましたか

mReportList.SelectedIndex = 0
于 2009-12-03T21:43:52.927 に答える