具有图像背景的可聚焦WinRT UserControl

时间:2014-05-09 21:42:58

标签: image user-controls windows-runtime focusable

我在开发可以显示图像以及可聚焦并接收键盘输入的WinRT控件时遇到困难。第一部分 - 在UserControl中显示图像 - 非常简单;使用子背景为ImageBrush的子矩形工作正常。

但是,调用UserControl.Focus(FocusState.Programmatic)(或任何其他焦点状态)不起作用 - 它返回false并且焦点未设置为用户控件。

顺便提一下,这个UserControl目前正在ContentControl中进行测试,不确定这是否有所不同。

如何使此UserControl具有焦点并能够接收键盘输入?

1 个答案:

答案 0 :(得分:2)

您需要设置IsTabStop="True"才能让它集中注意力。 UserControl's默认为False。

您需要做的另一件事是显示一个焦点指示器,您无法免费使用UserControl。以下是为其添加视觉效果的方式 - 从Button模板复制:

<Grid>
   <VisualStateManager.VisualStateGroups>
        <VisualStateGroup
            x:Name="FocusStates">
            <VisualState
                x:Name="Focused">
                <Storyboard>
                    <DoubleAnimation
                        Duration="0"
                        To="1"
                        Storyboard.TargetProperty="Opacity"
                        Storyboard.TargetName="FocusVisualWhite" />
                    <DoubleAnimation
                        Duration="0"
                        To="1"
                        Storyboard.TargetProperty="Opacity"
                        Storyboard.TargetName="FocusVisualBlack" />
                </Storyboard>
            </VisualState>
            <VisualState
                x:Name="Unfocused" />
            <VisualState
                x:Name="PointerFocused" />
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Rectangle
        x:Name="FocusVisualWhite"
        IsHitTestVisible="False"
        Opacity="0"
        StrokeDashOffset="1.5"
        StrokeEndLineCap="Square"
        Stroke="{ThemeResource FocusVisualWhiteStrokeThemeBrush}"
        StrokeDashArray="1,1" />
    <Rectangle
        x:Name="FocusVisualBlack"
        IsHitTestVisible="False"
        Opacity="0"
        StrokeDashOffset="0.5"
        StrokeEndLineCap="Square"
        Stroke="{ThemeResource FocusVisualBlackStrokeThemeBrush}"
        StrokeDashArray="1,1" />
</Grid>

您仍然需要切换视觉状态,因此您可以执行以下操作:

protected override void OnGotFocus(RoutedEventArgs e)
{
    base.OnGotFocus(e);
    this.UpdateVisualState(true);
}

protected override void OnLostFocus(RoutedEventArgs e)
{
    base.OnLostFocus(e);
    this.UpdateVisualState(true);
}

private void UpdateVisualState(bool useTransitions)
{
    switch (this.FocusState)
    {
        case FocusState.Programmatic:
        case FocusState.Keyboard:
            VisualStateManager.GoToState(this, "Focused", useTransitions);
            break;
        case FocusState.Pointer:
            VisualStateManager.GoToState(this, "PointerFocused", useTransitions);
            break;
        case FocusState.Unfocused:
            VisualStateManager.GoToState(this, "Unfocused", useTransitions);
            break;
    }
}