2016-03-24 2 views
0

У меня есть странная проблема: Я пытаюсь выбрать элемент в ListView WPF, например:WPF элемент ListView выбран только после того, как отображается MessageBox

int lineIndex = 123; 
scrollView.ScrollToVerticalOffset(lineIndex); 
myListView.SelectedIndex = lineIndex; 

Но выбор теряется по какой-то причине. Только если я отобразить MessageBox до оператора выбора, выбор работы, как это:

int lineIndex = 123; 
scrollView.ScrollToVerticalOffset(lineIndex); 
MessageBox.Show("msg"); 
myListView.SelectedIndex = lineIndex; 

После нажатия на кнопку OK в окне сообщения, получает выбранный индекс. Это потому, что окно сообщения блокирует поток пользовательского интерфейса во время его отображения? Если да, как я могу имитировать это поведение, не отображая окно сообщения?

ответ

0

Используется свойство SelectedItem, доступное вам вместо использования scrollviewer внутри списка? Следующий код демонстрирует выбор 20-го элемента в списке и прокрутку до его смещения.

<Window x:Class="testt.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:testt" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <ListView Name="myListView"/> 
    <Button Grid.Row="1" Height="40" Click="Button_Click">click</Button> 
</Grid> 

и код за

using System.Windows; 

namespace testt 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      for (int i = 0; i < 100; i++) 
       myListView.Items.Add("A test item " + i.ToString()); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      int lineIndex = 20; 
      var item = myListView.Items[lineIndex]; 
      myListView.ScrollIntoView(item); 
      myListView.SelectedItem = item; 
     } 
    } 
} 
+0

Я не могу использовать 'ScrollIntoView', потому что мой ListView использует виртуализацию данных. Элементы ListView являются экземплярами класса. Кажется, это какая-то проблема с пользовательским интерфейсом. Потому что, когда я показываю окно сообщения и нажимаю «ОК», пользовательский поток/рабочий поток продолжается, и элемент выбирается правильно. – JohnVn

Смежные вопросы