2016-01-03 4 views
0

Я делаю таймер с регулируемым временем. По этой причине я хочу установить время, используя списки (один за минуты и один за секунды). Заполнение списков осуществляется с помощью следующего кода.ListBox ScrollIntoView не работает OnNavigatedTo

public EditTime() 
    { 
     this.InitializeComponent(); 
     List<Numbers> numbers = new List<Numbers>(); 
     for (int i = 0; i < 61; i++) 
     { 
      numbers.Add(new Numbers() { Number = i }); 
     } 

     listBoxobjM.ItemsSource = numbers; 
     listBoxobjS.ItemsSource = numbers; 


     this.navigationHelper = new NavigationHelper(this); 
     this.navigationHelper.LoadState += this.NavigationHelper_LoadState; 
     this.navigationHelper.SaveState += this.NavigationHelper_SaveState; 

    } 

    public class Numbers 
    { 
     public int Number { get; set; } 
    } 

В XAML У меня есть следующий код для ListBoxes:

<Grid Grid.Row="1" x:Name="ContentRootM" Margin="65,0,0,0" Width="130"> 
      <ListBox Background="Transparent" Margin="10,10,10,10" BorderThickness="2" MaxHeight="580" Grid.Row="2" x:Name="listBoxobjM" VerticalContentAlignment="Top" HorizontalContentAlignment="Center"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Border Margin="5" BorderBrush="{ThemeResource ApplicationHeaderForegroundThemeBrush}" BorderThickness="1" Background="{ThemeResource ButtonBackgroundThemeBrush}"> 
          <TextBlock TextAlignment="Left" HorizontalAlignment="Left" Width="70" Height="80" x:Name="LbM" Text="{Binding Number}" FontSize="48" Foreground="{ThemeResource ButtonForegroundThemeBrush}" /> 
         </Border> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </Grid> 
     <Grid Grid.Row="1" x:Name="ContentRootS" Margin="10,0,0,0" Width="130"> 
      <ListBox Background="Transparent" Margin="10,10,10,10" Height="auto" BorderThickness="2" MaxHeight="580" Grid.Row="2" x:Name="listBoxobjS" VerticalContentAlignment="Top" HorizontalContentAlignment="Center"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Border Margin="5" BorderBrush="{ThemeResource ApplicationHeaderForegroundThemeBrush}" BorderThickness="1" Background="{ThemeResource ButtonBackgroundThemeBrush}"> 
          <StackPanel Width="125" Orientation="Horizontal" Grid.Row="1"> 
           <TextBlock TextAlignment="Left" HorizontalAlignment="Left" Width="70" Height="80" x:Name="LbS" Text="{Binding Number}" TextWrapping="Wrap" FontSize="48" Foreground="{ThemeResource ButtonForegroundThemeBrush}" /> 
          </StackPanel> 
         </Border> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </Grid> 

Когда я перейти к этой странице можно выбрать заранее заданного времени (минуты и секунды) с использованием listBoxobjM.SelectedIndex = я; в следующем коде. Я могу прокручивать вручную этот элемент и видеть, что он выбран.

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     this.navigationHelper.OnNavigatedTo(e); 
     string parameter = e.Parameter as string; 
     string[] parts = parameter.Split(';'); 
     id = int.Parse(parts[0]); 
     .... 
     DatabaseHelper fetch = new DatabaseHelper(); 
     TeamType team = fetch.GetTeamType(id); 

     for (int i = 0; i < 60; i++) 
     { 
      if (i == team.PlayTime.Minutes) 
      { 
       listBoxobjM.SelectedIndex = i; 
       listBoxobjM.ScrollIntoView(listBoxobjM.SelectedIndex); 
      } 
      if (i == team.PlayTime.Seconds) 
      { 
       listBoxobjS.SelectedIndex = i; 
       listBoxobjS.ScrollIntoView(listBoxobjS.SelectedIndex); 
      } 
     } 
    } 

Я хочу Listbox автоматически, чтобы перейти к SelectedIndex, но вместо этого Listbox показывает первые предметы сверху. Как я могу позаботиться о свиткахListBox в SelectedIndex?

+0

Проверьте, действительно ли ваши списки заполнены или заполнены при вводе OnNavigatedTo. –

+0

Вы можете улучшить свой код, сделав свой второй 'if'' else if' (если по какой-то причине не вычитает ряды минут), и я бы ожидал, что оба условия «вырвутся» из цикла for, когда вы его нашли (если вы не ищете последний матч, а не первый). Трудно сказать, не зная, что делает ваш код ... просто основывая это на общей схеме вашего кода. –

ответ

1

ListBox.ScrollIntoView() принимает элемент, который находится в ListBox, а не индекс. (MSDN documentation) Таким образом, вместо

listBoxobjM.ScrollIntoView(listBoxobjM.SelectedIndex); 

попробовать

listBoxobjM.ScrollIntoView(listBoxobjM.SelectedItem); 

вместо этого.

+0

1. В списках заполнены правильные данные: выбран правильный номер. –

+0

Я использую дважды оператор if, потому что я хочу, чтобы обе секунды и минуты были выбраны с соответствующим значением. Так оно и есть. Использование SelectedItem вместо SelectedIndex я уже пробовал, но результат все тот же. –

0

В конце концов я нашел решение самостоятельно через другой Stack Overflow question. Здесь у них также были проблемы с ListView, потому что он был заполнен задержкой. Используя ожидающий Task.Delay (см. Код), проблема решена. Я благодарю всех за его вклад.

for (int i = 0; i < 60; i++) 
     { 
      if (i == team.PlayTime.Minutes) 
      { 
       listBoxobjM.SelectedIndex = i; 
       await Task.Delay(1000); 
       listBoxobjM.ScrollIntoView(listBoxobjM.SelectedItem); 
      } 
      if (i == team.PlayTime.Seconds) 
      { 
       listBoxobjS.SelectedIndex = i; 
       await Task.Delay(1000); 
       listBoxobjS.ScrollIntoView(listBoxobjS.SelectedItem); 

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