Stackpanel中的用户控件失去焦点

时间:2018-04-03 22:02:38

标签: c# xamarin uwp focus autofocus

我正在创建一个XML表单阅读器。每种控件类型都是用户控件。然而,当用户点击不是聚焦控件(即TextBlock)的表格上的某处时,表单将焦点跳转到页面中的第一个可聚焦控件。 (即TextBox)

这会将页面滚动到顶部(通常),使用户远离他们正在处理的内容。

我在焦点事件周围尝试了很多不同的事情,但是如何解决这个问题却遇到了障碍。

处理此问题的最佳方法是什么?任何提示或提示将不胜感激。

由于

编辑(更多信息)

" MASTER"页面有StackPanel

<StackPanel x:Name="pnlFormMain" ScrollViewer.BringIntoViewOnFocusChange="False"/>

对于xml表单中的每个控件,都会将UserControl添加到stackpanel。

    <UserControl.Resources>
    <Storyboard x:Name="Show">
        <DoubleAnimation Duration="0:0:0.6" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="_WidgetMaster" d:IsOptimized="True"/>
    </Storyboard>
    <Storyboard x:Name="Hide">
        <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="_WidgetMaster" d:IsOptimized="True"/>
    </Storyboard>
</UserControl.Resources>

<Grid x:Name="grdInput" ScrollViewer.BringIntoViewOnFocusChange="False">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>


    <Grid Grid.Column="0" Grid.Row="0" ScrollViewer.BringIntoViewOnFocusChange="False">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="auto" />
        </Grid.ColumnDefinitions>
<!-- label -->
        <TextBlock x:Name="lblLabel" Text="Label" Grid.Column="0" VerticalAlignment="Center" Margin="3,6,5,5" TextWrapping="Wrap" />

        <!-- HINT -->
        <Ellipse x:Name="ellHint" Height="25" Width="25" Grid.Column="1" StrokeThickness="2" Stroke="LightBlue" Margin="5,0,5,0" Tapped="Hint_Tapped"  VerticalAlignment="Center">
            <Ellipse.Fill>
                <ImageBrush ImageSource="ms-appx:///XForms/Assets/information.png" />
            </Ellipse.Fill>
        </Ellipse>
    </Grid>
    <Frame x:Name="control" Grid.Column="1" Grid.Row="0" />
    <TextBlock x:Name="lblConstraintMessage" Grid.Row="2" Grid.ColumnSpan="99" FontSize="10" VerticalAlignment="Center" 
               HorizontalAlignment="Right" Margin="0,0,5,0" Visibility="Collapsed" />
</Grid>

几乎所有控件都使用相同的UserControl。该控件的输入是第二个UserControl,它会进入靠近底部的Frame

(例如)

<Grid x:Name="grdInput">        
    <TextBox x:Name="txtInput" Text="" Grid.Row="0" Grid.Column="1" Margin="15,0,0,0" LostFocus="txtInput_LostFocus" KeyDown="txtInput_KeyDown" TextAlignment="Right" />

    <Border x:Name="brdrValuePlaceholder" Background="Transparent" BorderThickness="0,0,0,1" BorderBrush="{ThemeResource TextControlBorderBrush}" HorizontalAlignment="Stretch" 
            Height="{ThemeResource TextControlThemeMinHeight}" Visibility="Collapsed">
        <TextBlock x:Name="lblInput" Text="" Grid.Row="0" Grid.Column="1" Margin="0,0,5,0" Tapped="lblInput_Tapped" TextAlignment="Right" HorizontalAlignment="Stretch"/>
    </Border>        
</Grid>

LostFocus事件只是在数据库中设置了一个值

母版页上的其他控件是PopupProgressRing 连同标题栏。

编辑2

我试图尽我所能使StackPanel无法对焦,并存储以前专注的控件,但可以让它们像希望的那样工作。

我已将源代码放在GitHub上,我是GitHub的新手,所以如果我需要做更多其他事情,请告诉我。代码有点旧,但有同样的问题。解决方案中还有一个Android和iOS应用程序,但只有UWP项目存在问题。

赏金仍然存在,如果有人可以提供帮助,将会获得奖励。 感谢

2 个答案:

答案 0 :(得分:1)

也许它专注于stackpanel本身?

在页面中有弹出对话框或文本字符串,以显示始终关注的内容。这样你就可以看出stacklayout是否正在变得更加集中。

另一种可能性是,如果你点击它,它会将焦点返回到stacklayout上的第一个元素(它被视为点击的那个)。

答案 1 :(得分:1)

重新创建您的确切场景并非易事。但是,您的问题应该有几种可能的解决方案。

我想到的第一件事是截取表单中的Preview *键盘/鼠标事件。

  • 当文本框中的KeyDown / MouseDown / Tap在其具有焦点时被检测到,请调用更新FocusManager的绑定表达式,并设置Handled=true以防止KeyDown或MouseDown事件被进一步处理单击非用户控件。 markup extension也可能会有所帮助。
  • 挂起PreviewLost * Focus以检测任何不需要的焦点变化也是至关重要的。

另一种方法可能是在XAML中将所有无用户输入UI元素标记为Focusable=false,例如。

<XY Focusable="False">
...
</XY>

disable他们在一起。