2014-05-09 6 views
0

이미지를 표시하고 포커스를받을 수 있고 키보드 입력을받을 수있는 WinRT 컨트롤을 개발하는 데 어려움이 있습니다. 첫 번째 부분은 - UserControl에 이미지를 표시하는 것 - 간단합니다. 배경이 ImageBrush 인 자식 Rectangle을 사용하면 문제가 없습니다.이미지 배경이있는 Focusable WinRT UserControl

그러나 UserControl.Focus(FocusState.Programmatic) (또는 다른 포커스 상태)을 호출하면 작동하지 않습니다. false를 반환하고 포커스는 사용자 정의 컨트롤로 설정되지 않습니다.

덧붙여 말하자면,이 UserControl은 현재 ContentControl 내에서 테스트되고 있습니다. 차이가 있는지는 확실하지 않습니다.

어떻게이 UserControl을 포커스 가능하게 만들고 키보드 입력을받을 수 있습니까?

답변

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; 
    } 
} 
+0

덕분에 많은 자세한 대답은 – bright

관련 문제