Шаблон 10 AutoSuggestBox в PageHeader

В настоящее время я разрабатываю приложение UWP и использую шаблон Template10 Hamburger. Я хотел добавить AutoSuggestBox в PageHeader, который отлично работает, если я не устанавливаю какие-либо первичные или вторичные команды. Если я устанавливаю какие-либо команды, обе команды и AutoSuggestBox перекрываются. Что я сделал, так это установил правильное значение заполнения для PageHeader следующим образом:

<controls:PageHeader x:Name="pageHeader" Text="Main Page" Padding="0,0,283,0">
    <!--  place stretched, across top  -->
    <RelativePanel.AlignTopWithPanel>True</RelativePanel.AlignTopWithPanel>
    <RelativePanel.AlignLeftWithPanel>True</RelativePanel.AlignLeftWithPanel>
    <RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>
    <!--  secondary commands  -->
    <controls:PageHeader.SecondaryCommands>
        <AppBarButton Click="{x:Bind ViewModel.GotoSettings}" Label="Settings" />
        <AppBarButton Click="{x:Bind ViewModel.GotoPrivacy}" Label="Privacy" />
        <AppBarButton Click="{x:Bind ViewModel.GotoAbout}" Label="About" />
    </controls:PageHeader.SecondaryCommands>
</controls:PageHeader>
<AutoSuggestBox Margin="0,8,12,0" Width="270" QueryIcon="Find" PlaceholderText="Search">
    <RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>
</AutoSuggestBox>

Мой вопрос: это предлагаемый способ сделать это или есть другой способ? заранее спасибо


person OnlyOneEA    schedule 08.03.2016    source источник


Ответы (2)


Я думаю, что самый простой способ поместить содержимое в CommandBar (и, следовательно, в PageHeader, который наследуется от него) — это использовать свойство CommandBar Content, например:

    <RelativePanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <controls:PageHeader x:Name="pageHeader" BackButtonVisibility="Visible" Frame="{x:Bind Frame}">
        <controls:PageHeader.PrimaryCommands>
            <AppBarButton Label="Shuffle" Icon="Shuffle"></AppBarButton>
            <AppBarButton Label="Send" Icon="Send"></AppBarButton>
        </controls:PageHeader.PrimaryCommands>
        <RelativePanel.AlignTopWithPanel>True</RelativePanel.AlignTopWithPanel>
        <RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>
        <RelativePanel.AlignLeftWithPanel>True</RelativePanel.AlignLeftWithPanel>
        <controls:PageHeader.Content>
            <AutoSuggestBox Margin="0,8,12,0" Width="270" QueryIcon="Find" PlaceholderText="Search">
            </AutoSuggestBox>
        </controls:PageHeader.Content>
    </controls:PageHeader>
</RelativePanel>

К сожалению, область содержимого CommandBar зафиксирована в левой части экрана, и, честно говоря, я не знаю простого способа переключить ее на правую. Существует свойство FlowDirection, но оно предназначено для языков с письмом справа налево и может привести к очень странному поведению при использовании в языках с письмом слева направо (первое, что вы можете заметить, если вы попробуйте, чтобы значок поиска AutoSuggestBox переключался слева от поля, а кнопка «Назад», если она есть, переключалась в крайнем правом углу панели, что, я думаю, пользователи сочтут довольно странным).

Однако вы можете добиться того, чего хотите, поместив два PageHeader один рядом с другим, используя расширенные возможности позиционирования RelativePanel: в первый вы помещаете первичную и (в конечном итоге) вторичную команды; во втором ваш AutoSuggestBox и, возможно, другой контент, если он вам нужен. Имейте в виду, вы должны указать ширину (или MaxWidth) для первого заголовка страницы (того, что слева, который содержит команды), который соответствует содержимому, которое вы собираетесь в него поместить. Кроме того, вы должны изменить его HorizontalAlignment на Left и удалить RelativePanel.AlignRightWithPanel. Во втором PageHeader вы используете RelativePanel.AlignTopWithPanel = True, RelativePanel.AlignRightWithPanel = true и RelativePanel.RightOf = pageHeader (то есть имя, которое вы даете первому PageHeader), как в следующем коде:

    <RelativePanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <controls:PageHeader x:Name="pageHeader" BackButtonVisibility="Visible" Frame="{x:Bind Frame}" MaxWidth="200" HorizontalAlignment="Left">
        <controls:PageHeader.PrimaryCommands>
            <!--Two sample primary commands -->
            <AppBarButton Label="Shuffle" Icon="Shuffle"></AppBarButton>
            <AppBarButton Label="Send" Icon="Send"></AppBarButton>
        </controls:PageHeader.PrimaryCommands>

        <RelativePanel.AlignTopWithPanel>True</RelativePanel.AlignTopWithPanel>
        <!--<RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>-->
        <RelativePanel.AlignLeftWithPanel>True</RelativePanel.AlignLeftWithPanel>
    </controls:PageHeader>
    <controls:PageHeader x:Name="pageHeader2" HorizontalAlignment="Right">
        <controls:PageHeader.Content>
            <AutoSuggestBox Margin="0,8,12,0" Width="270" QueryIcon="Find" PlaceholderText="Search">
            </AutoSuggestBox>
        </controls:PageHeader.Content>

        <RelativePanel.AlignTopWithPanel>True</RelativePanel.AlignTopWithPanel>
        <RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>
        <RelativePanel.RightOf>pageHeader</RelativePanel.RightOf>
    </controls:PageHeader>
</RelativePanel>

В результате получилось то, что вы можете увидеть на следующем снимке экрана:

Два заголовка страницы рядом

Надеюсь, это помогло.

person Francesco Blue    schedule 18.03.2016

Эй, что я сделал для AutoSuggestBox, чтобы поместить его в UserControl и назвал этот пользовательский элемент управления в содержимом AppBarButton следующим образом:

 <AppBarButton x:Name="SearchBarUserControl"
                          Style="{StaticResource SearchAppBarButtonStyle}"
                          Visibility="Visible">
                <AppBarButton.Content>
                    <controls1:SearchBarUserControl Height="40" HorizontalAlignment="Stretch" />
                </AppBarButton.Content>
 </AppBarButton>

Редактировать1:

ваш код должен выглядеть так:

<controls:PageHeader x:Name="pageHeader" Text="Main Page" Padding="0,0,283,0">
  <AppBarButton x:Name="SearchBarUserControl"
                              Style="{StaticResource SearchAppBarButtonStyle}"
                              Visibility="Visible">
                    <AppBarButton.Content>
                        <controls1:SearchBarUserControl Height="40" HorizontalAlignment="Stretch" />
                    </AppBarButton.Content>
     </AppBarButton>
    <!--  place stretched, across top  -->
    <RelativePanel.AlignTopWithPanel>True</RelativePanel.AlignTopWithPanel>
    <RelativePanel.AlignLeftWithPanel>True</RelativePanel.AlignLeftWithPanel>
    <RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>
    <!--  secondary commands  -->
    <controls:PageHeader.SecondaryCommands>
        <AppBarButton Click="{x:Bind ViewModel.GotoSettings}" Label="Settings" />
        <AppBarButton Click="{x:Bind ViewModel.GotoPrivacy}" Label="Privacy" />
        <AppBarButton Click="{x:Bind ViewModel.GotoAbout}" Label="About" />
    </controls:PageHeader.SecondaryCommands>
</controls:PageHeader>

Редактировать 2: (панель поиска на вторичной панели команд)

<controls:PageHeader x:Name="pageHeader" Text="Main Page" Padding="0,0,283,0">
    <!--  place stretched, across top  -->
    <RelativePanel.AlignTopWithPanel>True</RelativePanel.AlignTopWithPanel>
    <RelativePanel.AlignLeftWithPanel>True</RelativePanel.AlignLeftWithPanel>
    <RelativePanel.AlignRightWithPanel>True</RelativePanel.AlignRightWithPanel>
    <!--  secondary commands  -->
    <controls:PageHeader.SecondaryCommands>
        <AppBarButton Click="{x:Bind ViewModel.GotoSettings}" Label="Settings" />
        <AppBarButton Click="{x:Bind ViewModel.GotoPrivacy}" Label="Privacy" />
        <AppBarButton Click="{x:Bind ViewModel.GotoAbout}" Label="About" />
<AppBarButton x:Name="SearchBarUserControl"
                              Style="{StaticResource SearchAppBarButtonStyle}"
                              Visibility="Visible">
                    <AppBarButton.Content>
                        <controls1:SearchBarUserControl Height="40" HorizontalAlignment="Stretch" />
                    </AppBarButton.Content>
     </AppBarButton>

  </controls:PageHeader.SecondaryCommands>
</controls:PageHeader>
person Damien    schedule 09.03.2016
comment
Я бы вставил это в файл Shell.xaml? - person OnlyOneEA; 15.03.2016
comment
в ваших ‹controls:PageHeader› - person Damien; 15.03.2016
comment
При этом он помещает панель поиска слева от всего. Я хочу, чтобы это было справа от вторичных команд. - person OnlyOneEA; 16.03.2016
comment
Я обновил код, пожалуйста, скажите мне, работает ли это для вас - person Damien; 21.03.2016
comment
При применении обновленного кода окно поиска перемещается во вторичное меню команд, чего я не хотел. Кроме того, по какой-то причине строка поиска не видна в меню, а только пустое место при наведении на нее. Должен быть лучший способ реализовать поиск прямо в заголовке страницы... - person OnlyOneEA; 24.03.2016