我正在创建一个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
事件只是在数据库中设置了一个值
母版页上的其他控件是Popup
和ProgressRing
连同标题栏。
编辑2
我试图尽我所能使StackPanel
无法对焦,并存储以前专注的控件,但可以让它们像希望的那样工作。
我已将源代码放在GitHub上,我是GitHub的新手,所以如果我需要做更多其他事情,请告诉我。代码有点旧,但有同样的问题。解决方案中还有一个Android和iOS应用程序,但只有UWP项目存在问题。
赏金仍然存在,如果有人可以提供帮助,将会获得奖励。 感谢
答案 0 :(得分:1)
也许它专注于stackpanel本身?
在页面中有弹出对话框或文本字符串,以显示始终关注的内容。这样你就可以看出stacklayout是否正在变得更加集中。
另一种可能性是,如果你点击它,它会将焦点返回到stacklayout上的第一个元素(它被视为点击的那个)。
答案 1 :(得分:1)
重新创建您的确切场景并非易事。但是,您的问题应该有几种可能的解决方案。
我想到的第一件事是截取表单中的Preview *键盘/鼠标事件。
Handled=true
以防止KeyDown或MouseDown事件被进一步处理单击非用户控件。 markup extension也可能会有所帮助。另一种方法可能是在XAML中将所有无用户输入UI元素标记为Focusable=false
,例如。
<XY Focusable="False">
...
</XY>
或disable
他们在一起。