2012-07-26 4 views
3

현재 작업하고있는 컨트롤에서 항목에 포커스가있을 때 기본 포커스 사각형이 전체 행과 보이는 모든 자식 항목에 걸쳐 있습니다. 나는 그것을 숨기는 방법을 안다. 그러나 항목에 키보드 포커스가있는 경우에도 여전히 포커스 표시기가 필요합니다. IsKeyboardFocused 속성에 대해 읽었지만 항목이 마우스로 클릭되었을 때도 마찬가지입니다. 그래서 나는 FocusVisualStyle을 어떻게 든 사용해야한다고 생각한다. 그러나 나는 방법을 이해할 수 없다.자식 요소에 포커스 사각형 적용

:

enter image description here

여기 컨트롤 템플릿 내 XAML 코드입니다 :이 그것을 좋아한다 무엇

enter image description here

그리고 :처럼 여기

기본 초점 모습입니다
<Border ...> 
    <ContentPresenter FocusManager.IsFocusScope="True" 
     Content="{TemplateBinding HeaderedContentControl.Header}" 
     ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}" 
     ContentStringFormat="{TemplateBinding HeaderedItemsControl.HeaderStringFormat}" 
     ContentSource="Header" 
     Name="PART_Header" .../> 
</Border> 
<!-- Additional border glare inside the item --> 
<Border BorderThickness="1" BorderBrush="#80ffffff" Margin="1" 
    SnapsToDevicePixels="True" CornerRadius="2"/> 
<!-- Focus rectangle inside the item --> 
<Rectangle StrokeDashArray="1 2" StrokeThickness="1" Stroke="Black" 
    SnapsToDevicePixels="True" Margin="2" 
    Visibility="Hidden" Name="FocusRectangle" 
    FocusVisualStyle="{StaticResource FocusStyle}"/> 

내 XAML에는 기본적으로 보이지 않는 포커스 사각형이 이미 있습니다. FocusVisualStyle 또는 무엇이든, 그것은 보이게 만들어야합니다. 그러나 나는 그렇게 할 수 없었다. 어떤 초점에서도 보입니다.

답변

0

문제점의 해결 방법을 발견했습니다. 그것은 나에게도 똑같은 것처럼 보입니다. 그러나 그것이 올바른 방법인지 확실하지 않습니다. 위에서 FocusRectangle을 사용하고 있고 그것을 직접 보이거나 감추고 싶습니다.

<!-- Show the focus rectangle when the item is focused --> 
<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="Controls:TreeViewExItem.IsKeyboardMode" Value="True"/> 
    <Condition Property="Controls:TreeViewExItem.IsFocused" Value="True"/> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="FocusRectangle" Property="Visibility" Value="Visible"/> 
</MultiTrigger> 

그럼 내가 마지막 입력은 마우스 나 키보드에서 온 것인지 여부를 나타냅니다 TreeViewExItem에 새로운 속성을 추가 한 :

다음은 포커스 사각형의 가시성을 관리하는 트리거입니다. 이것은 터치 나 스타일러스로 확장 될 수 있지만 테스트 할 장치가 없습니다.

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    base.OnPreviewKeyDown(e); 
    if (!IsKeyboardMode) 
    { 
     IsKeyboardMode = true; 
     //Debug.WriteLine("Changing to keyboard mode from PreviewKeyDown"); 
    } 
} 

protected override void OnPreviewKeyUp(KeyEventArgs e) 
{ 
    base.OnPreviewKeyDown(e); 
    if (!IsKeyboardMode) 
    { 
     IsKeyboardMode = true; 
     //Debug.WriteLine("Changing to keyboard mode from PreviewKeyUp"); 
    } 
} 

protected override void OnPreviewMouseDown(MouseButtonEventArgs e) 
{ 
    base.OnPreviewMouseDown(e); 
    if (IsKeyboardMode) 
    { 
     IsKeyboardMode = false; 
     //Debug.WriteLine("Changing to mouse mode"); 
    } 
} 
:

는 같은 IsKeyboardMode 속성은 여기에 TreeViewEx의 부모 컨트롤에 추가하고
<!-- Pass on the TreeViewEx' IsKeyboardMode value to each item because 
    we couldn't access it otherwise in the triggers --> 
<Setter Property="IsKeyboardMode" 
    Value="{Binding (Controls:TreeViewEx.IsKeyboardMode), 
    RelativeSource={RelativeSource 
     AncestorType={x:Type Controls:TreeViewEx}}, Mode=OneWay}" /> 

내 마법을 제공 :

public static DependencyProperty IsKeyboardModeProperty = 
    DependencyProperty.Register(
     "IsKeyboardMode", 
     typeof(bool), 
     typeof(TreeViewExItem), 
     new FrameworkPropertyMetadata(false, null)); 

public bool IsKeyboardMode 
{ 
    get 
    { 
     return (bool) GetValue(IsKeyboardModeProperty); 
    } 
    set 
    { 
     SetValue(IsKeyboardModeProperty, value); 
    } 
} 

이 속성은 바인딩을 통해 부모 컨트롤에서 각 항목에 전달

키보드 및 마우스의 미리보기 이벤트에 반응하여 적절한 입력 모드를 설정합니다. 마지막 입력이 키보드에서 나온 경우에만 초점 사각형이 표시됩니다.

관련 문제