Выбор элемента в Navigation View переполнения списка программно

Основываясь на предыдущей работе, я подумал о том, чтобы усилить логику повтора тремя способами:

  1. Указание типа исключения для catch / retry. Это первичное улучшение, поскольку повторная попытка для любого исключения просто неверна.
  2. Не вложив последнюю попытку в try / catch, получив чуть более высокую производительность
  3. . Это расширение Action метода расширения
    static class ActionExtensions
    {
      public static void InvokeAndRetryOnException<T> (this Action action, int retries, TimeSpan retryDelay) where T : Exception
      {
        if (action == null)
          throw new ArgumentNullException("action");
    
        while( retries-- > 0 )
        {
          try
          {
            action( );
            return;
          }
          catch (T)
          {
            Thread.Sleep( retryDelay );
          }
        }
    
        action( );
      }
    }
    

Затем метод можно вызвать таким образом (конечно, можно использовать и анонимные методы):

new Action( AMethodThatMightThrowIntermittentException )
  .InvokeAndRetryOnException<IntermittentException>( 2, TimeSpan.FromSeconds( 1 ) );
0
задан Anddev 15 January 2019 в 09:52
поделиться

1 ответ

Параметр неверен. container '

Для объяснения этого поведения нам нужно проверить стиль NavigationView в файле Generic.xaml .

<Button 
    x:Name="TopNavOverflowButton"
    Grid.Column="4"

    Content="More"
    Style="{StaticResource NavigationViewOverflowButtonStyleWhenPaneOnTop}"
    Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.OverflowButtonVisibility}">

    <Button.Flyout>
        <Flyout Placement="Bottom">
            <Flyout.FlyoutPresenterStyle>
                <Style TargetType="FlyoutPresenter">
                    <Setter Property="Padding" Value="0,8" />
                    <!-- Set negative top margin to make the flyout align exactly with the button -->
                    <Setter Property="Margin" Value="0,-4,0,0" />
                </Style>
            </Flyout.FlyoutPresenterStyle>
            <NavigationViewList x:Name="TopNavMenuItemsOverflowHost" ItemTemplate="{TemplateBinding MenuItemTemplate}" ItemTemplateSelector="{TemplateBinding MenuItemTemplateSelector}" ItemContainerStyle="{TemplateBinding MenuItemContainerStyle}" ItemContainerStyleSelector="{TemplateBinding MenuItemContainerStyleSelector}" SingleSelectionFollowsFocus="False" IsItemClickEnabled="True">
                <ListView.ItemContainerTransitions>
                    <TransitionCollection />
                </ListView.ItemContainerTransitions>
            </NavigationViewList>
        </Flyout>
    </Button.Flyout>
</Button>

Как видите, Больше элементов хранятся в TopNavMenuItemsOverflowHost NavigationViewList. и это контейнер Flyout . Flyout - это ленивый контроль загрузки. Если он не всплывает, его содержимое не будет загружено. Вот почему контейнер отсутствует.

Я думаю, что нецелесообразно фокусировать неокончательный пункт в TopNavMenuItemsOverflowHost. если вы хотите правильно выбрать элемент, убедитесь, что ширина окна достаточна, чтобы все элементы отображались в NavigationView.

0
ответ дан Nico Zhu - MSFT 15 January 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: