2014-10-06 2 views
2

У меня есть приложение WPF в стиле Windows Store, и я просто добавил к нему поиск. Когда я нажимаю кнопку «Поиск» в панели приложений, я устанавливаю свой FlyoutPresenter, содержащий SearchBox, Visible. Эта кнопка расположена в нижнем правом углу. Он отлично работает на компьютерах с клавиатурами, но у меня возникла проблема, когда открывается виртуальная клавиатура или InputPane. Во-первых, клавиатура закрыла коробку. Я решил эту проблему, проверив и отрегулировав поле поля, когда ящик находится в фокусе, но когда я просматриваю страницу до самого верхнего и нижнего уровня, элемент управления начинает перемещаться по странице. Вот мой минимальный код:Исправлено позиционирование в XAML

XAML:

<Grid Background="White" x:Name="MainGrid"> 

    <!-- App Bar with Search button --> 
    <AppBar x:Name="BAppBar" VerticalAlignment="Bottom"> 
     <CommandBar> 
      <CommandBar.PrimaryCommands> 
       <AppBarButton Icon="Find" Label="Search" Click="Search_Click"/> 
      </CommandBar.PrimaryCommands> 
     </CommandBar> 
    </AppBar> 

    <!-- Search button and Close button --> 
    <FlyoutPresenter VerticalAlignment="Top" Name="SearchPop" Visibility="Collapsed"> 
     <StackPanel Orientation="Horizontal"> 
      <SearchBox Name="Search" GotFocus="Search_Focus" LostFocus="Search_Focus"/> 
      <AppBarButton Name="SearchClose" Icon="Cancel" Click="Search_Close" /> 
     </StackPanel> 
    </FlyoutPresenter> 
</Grid> 

C#:

public partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    // Close app bar, show search box, and set margin to bottom of page 
    private void Search_Click(object sender, RoutedEventArgs e) 
    { 
     BAppBar.IsOpen = false; 
     SearchPop.Visibility = Windows.UI.Xaml.Visibility.Visible; 

     SearchPop.Margin = new Thickness(0, MainGrid.ActualHeight - SearchPop.ActualHeight, 0, 0); 
    } 

    // Set margin for opening/closing virtual keyboard 
    private void Search_Focus(object sender, RoutedEventArgs e) 
    { 
     Windows.UI.ViewManagement.InputPane.GetForCurrentView().Showing += (s, args) => 
     { 
      double flyoutOffset = (int)args.OccludedRect.Height - SearchPop.ActualHeight; 
      SearchPop.Margin = new Thickness(0, flyoutOffset, 0, 0); 
     }; 
     Windows.UI.ViewManagement.InputPane.GetForCurrentView().Hiding += (s, args) => 
     { 
      SearchPop.Margin = new Thickness(0, MainGrid.ActualHeight - SearchPop.ActualHeight, 0, 0); 
     }; 
    } 

    // Close search 
    private void Search_Close(object sender, RoutedEventArgs e) 
    { 
     SearchPop.Visibility = Windows.UI.Xaml.Visibility.Collapsed; 
    } 
} 

Что мне нужно для коробки не будут затронуты пользователем прокрутки на экране. В HTML это называется «Фиксированное позиционирование». Я прочитал, что это невозможно изначально в XAML, но есть обходные пути. Я прочитал этот MSDN и SO ссылки, но они не очень помогают:

http://social.msdn.microsoft.com/Forums/en-US/9779328a-a7cd-447d-a4ac-bcc952083f43/fixed-positioning-in-wpf?forum=wpf

http://social.msdn.microsoft.com/Forums/windowsapps/en-US/7349d01d-dc0e-4e1c-9327-df90e00fbebf/how-to-handle-the-appearance-of-the-onscreen-keyboard?forum=winappswithcsharp

Popup control moves with parent

+0

ОК, просто чтобы все знали, я никогда не решал этот вопрос так, как он есть, но я исправил свою проблему, переместив окно поиска вверху страницы, пока входная панель открыта. Любые ответы будут оценены. – Hosch250

ответ

1

Вы можете моделировать фиксированное поведение в XAML в очень простом способе:

<Grid Background="White" x:Name="MainGrid"> 
    <ContentControl VerticalAligment="Stretch" HorizontalAligment="Stretch"> 
    <!--All other visual controls, the float item will be located over all controls located here, even scrolls viewers--> 
    </ContentControl> 

    <!-- Float item --> 
    <SomeControl> 
    <!--The control you want be over in the fixed position, 
     you can set the layout to it, and locate it where you want 
     just set the Vertical/Horizontal Aligment, margin, height, width--> 
    </SomeControl> 
</Grid> 

(Извините, если в образце кода есть некоторые ошибки синтакса, я написал его на лету) Также wpf имеет некоторые элементы управления, которые отображаются на слое поверх всех остальных, это элементы контекстного меню, подсказки и обложки, вы также можете попробовать их.

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

+0

Я обязательно буду в этом разбираться. Я знаю о подсказках, но они исчезают, когда мышь убирается, в то время как это должно оставаться открытым, пока пользователь не закроет его. Я не знал об adorners до тех пор, пока я не написал об этом вопросе, но я уже просмотрел их, и они не поддерживаются в приложениях Windows Store (пока). Я еще не заглянул в подсказки, но сделаю это. – Hosch250

+0

Это не работает. Что происходит, когда открывается InputPane, вся сетка сдвигается вверх. Это не работает в любом другом приложении в моей системе, поэтому должен быть способ сделать InputPane просто перемещаться по сетке, а не нажимать на нее. Прямо сейчас, это то, что я изучаю. Тогда все остальное будет легко. – Hosch250

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