У меня есть приложение 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 ссылки, но они не очень помогают:
Popup control moves with parent
ОК, просто чтобы все знали, я никогда не решал этот вопрос так, как он есть, но я исправил свою проблему, переместив окно поиска вверху страницы, пока входная панель открыта. Любые ответы будут оценены. – Hosch250