【问题标题】:How can you keep focus when pressing a disabled button in a scrolviewer in xaml?在xaml的scrollviewer中按下禁用按钮时如何保持焦点?
【发布时间】:2019-01-13 08:16:40
【问题描述】:

从 Visual Studio 为 UWP 创建默认 C++ xaml 空白应用时,在 xaml 页面中添加以下代码。

       <ScrollViewer>
            <StackPanel>
                <TextBox Height="20"></TextBox>
                <TextBox Height="800"></TextBox>
                <Button Content="Enabled" IsEnabled="True"></Button>
                <Button Content="Disabled" IsEnabled="False"></Button>
            </StackPanel>
        </ScrollViewer>

如果我将焦点放在启用按钮上,然后按下禁用按钮,焦点将转移到第一个文本框。

我找到了一种解决方法,即添加一个 0 维可聚焦元素作为堆栈面板的第一个元素。 &lt;Button Width="0" Height="0"&gt;&lt;/Button&gt;

但这会影响其他孩子。 (id 会变 1)

您知道在 scollviewer 中按下面板中的禁用按钮后将焦点保持在前一个元素上的更优雅的方法吗?

如果堆栈面板不在滚动查看器中,则该行为不存在。

【问题讨论】:

标签: xaml uwp-xaml c++-cx


【解决方案1】:

您可以在 ScrollViewer 的 Tapped 事件中以编程方式更改应用的焦点。

在 xaml 中:

<ScrollViewer Tapped="ScrollViewer_Tapped">
    <StackPanel>
        <TextBox Height="20"></TextBox>
        <TextBox Height="200"></TextBox>
        <Button Content="Enabled"  x:Name="EnableButton"></Button>
        <Button Content="Disabled" IsEnabled="False"></Button>
    </StackPanel>
</ScrollViewer>

在 xaml.cpp 中,处理 ScrollViewer_Tapped 事件以使 EnableButton 获得焦点。

void CApp::MainPage::ScrollViewer_Tapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e)
{
    EnableButton->Focus(Windows::UI::Xaml::FocusState::Programmatic);
}

如果您有任何其他控件可以获得焦点,您还应该处理它们的类似事件以分配焦点。

【讨论】:

  • 我需要将焦点放在最后一个焦点元素上,而不是特定元素。如果我能接触到所有的孩子,我知道该怎么做。在 GetFocus 上标记谁获得了焦点并点击以专注于那个人。我只能访问 ScrollViewer、面板和禁用按钮。我也想在按下禁用按钮时有所不同。就像如果按下禁用按钮 id 对焦点没有任何作用,如果只按下滚动查看器,则焦点滚动查看器。
  • 我可以有多个 ScrollViewer,每个都应该跟踪最后一个关注的孩子。我想知道是否有一种更简单的方法可以将 DependencyProperty 保留在它的最后一个焦点子项的 ScrollViewer 中。一个标志或一个简单的事件回调。
  • 由于您按下 ScrollViewer 中的禁用按钮,因此 ScrollViewer 将获得焦点。您可以使用变量记录最后一个焦点,然后在单击无法获得焦点的 ScrollViewer 区域时使其成为焦点。
  • 我希望有一个解决方案,它不需要每个子元素都有一个 GotFocus,它应该注册为最后一个焦点元素。我可以直接在 ScrollViewer 中更改的内容。 (如果可以让 scvrollviewer 直接通知哪个孩子获得焦点,而不是孩子)
  • UWP 页面与网页不同。所有控件的底部都有一个 ScrollViewer,如果单击禁用按钮,则 ScrollViewer 将获得焦点。这是 uwp 中所需的行为。也许还有其他替代方案可以满足您的实际要求。
【解决方案2】:

找到了解决办法。在 PointerPressed 上获取 current focused element 作为 UIElement^ 和 capture the pointer

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 2011-04-22
    • 2021-05-20
    • 1970-01-01
    • 2019-04-09
    • 2021-05-21
    • 2014-09-04
    • 2022-12-17
    相关资源
    最近更新 更多