I want to use the CommandBar
and a Flyout
to build something like this.
The user should click the button in the CommandBar
(Flyout
opens), then enter text in the TextBox
and then click the button on the right of TextBox
to start the search request.
The problem is, that when I click at the TextBox I can't enter text. It seems that it loses the focus, before I can write something. Below is the sample code. Whats wrong?
<Page.Resources>
<DataTemplate x:Key="Search">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" />
<AppBarButton Grid.Column="1" Icon="Find" />
</Grid>
</DataTemplate>
</Page.Resources>
<Grid>
<CommandBar RequestedTheme="Dark">
<AppBarButton Icon="Find">
<AppBarButton.Flyout>
<Flyout Placement="Bottom" >
<ContentPresenter ContentTemplate="{StaticResource Search}"/>
</Flyout>
</AppBarButton.Flyout>
</AppBarButton>
</CommandBar>
</Grid>
Set AllowFocusOnInteraction
property to true
on the AppBarButton
.
<AppBarButton x:Name="myAppBarButton"
Icon="Find"
AllowFocusOnInteraction="True">
<AppBarButton.Flyout>
<Flyout Placement="Bottom" >
<ContentPresenter ContentTemplate="{StaticResource Search}"/>
</Flyout>
</AppBarButton.Flyout>
</AppBarButton>
If the app's minimum version is lower than Anniversary update 1607 (build 10.0.14393) (even if your target version is 1607 or higher), you can't set the AllowFocusOnInteraction
property directly in XAML. Instead, you should do it in code-behind.
// check if the AllowFocusOnInteraction property is available on the platform
if (Windows.Foundation.Metadata.ApiInformation.IsPropertyPresent("Windows.UI.Xaml.FrameworkElement", "AllowFocusOnInteraction"))
myAppBarButton.AllowFocusOnInteraction = true;
You can also wrap it into an attached property that can be used in XAML even on old Windows 10 versions.
This is a new feature on Windows 10 Anniversary update (1607), build 14393.
That's an improvement for most app bar uses but interferes with yours, so you'll need to override the default value when you change your build to rather 14393 instead of 10586.
Here's a blog post ComboBox on a Flyout attached to an AppBarButton loses mouse input on 1607. It also contains the attached property implementation.
your TextBox is actually never getting focus at all, somehow flyout prevents it, the only action I can get from this TextBox is PointerOver state - causing it to look like it's got focus, but it is not.
You need to set the focus in the code, for example when the flyout opens - it works, but may be not the nicest solution, cause you need to name the TextBox in order to get it from code behind.
<Grid>
<CommandBar RequestedTheme="Dark">
<AppBarButton Icon="Find">
<AppBarButton.Flyout>
<Flyout Placement="Bottom" Opened="FlyoutBase_OnOpened">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox x:Name="Test"/>
<AppBarButton Grid.Column="1" Icon="Find"/>
</Grid>
</Flyout>
</AppBarButton.Flyout>
</AppBarButton>
</CommandBar>
</Grid>
and then code behind:
private void FlyoutBase_OnOpened(object sender, object e)
{
Test.Focus(FocusState.Programmatic);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With