2011-04-26 2 views
6

텍스트 상자에 IsTabStop을 false로 설정하고 컨트롤에서 포커스를받을 수 없지만 Silverlight Forums에 따라 마우스 이벤트를받을 수 있어야합니다. 내가 MouseLeftButtonUp 이벤트 유선 및 내 tbxTotal_MouseLeftButtonUp 메서드에서 중단 점을 있고 디버깅하는 동안 적중 결코 가져옵니다. SL 포럼의 스레드는 꽤 오래되었으므로 아마도 어딘가에서 업데이트가 변경되었을 것입니다. 탭으로 이동할 수는 없지만 여전히 편집 가능한 텍스트 상자가 필요합니다. 정말 힘들어 야할까요?SL4 텍스트 상자에서 IsTabStop = False입니다.

답변

3

나는 이것을 깨닫지 못했지만, 그럴 듯하다. 또한, MouseLeftButtonUp이 작동하지 않는 것처럼 보입니다. MouseLeftButtonDown이 실행되지만이 해킹을 수행 할 수 있습니다.

<TextBox IsTabStop="False" MouseLeftButtonDown="TextBox_MouseLeftButtonDown" /> 

다음 코드에서 이와 같은 이벤트를 처리 할 수 ​​있습니다.

private void TextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var textBox = ((TextBox) sender); 
     textBox.IsTabStop = true; 
     textBox.Focus(); 
     textBox.IsTabStop = false; 
    } 

그것은 가치있는 동안이 CustomControl에

public class FocusableTextBox : TextBox 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     if (!IsTabStop) 
     { 
      IsTabStop = true; 
      Focus(); 
      IsTabStop = false; 
     } 

     base.OnMouseLeftButtonDown(e); 
    } 
} 
+0

ㅎ, MouseLeftButtonDown이 작동하는지조차 알지 못했습니다. 가정이 나쁘다는 것을 보여 주기만하면됩니다. 감사. – seekerOfKnowledge

+0

하지만 성가신 것, 그냥 .Focus를 호출하면 MouseLeftButtonDown이 켜지지 않는 이유가 작동하지 않습니다. ( – bendewey

+2

또한 내 텍스트 상자가 트리보기에 있기 때문에 이상한 일들이 일어나고 있습니다. 텍스트 상자에서 마우스가 눌려지면 IsTabStop을 true로 설정하고 LostFocus에서는 IsTabStop을 false로 설정합니다. 그러나 텍스트 상자가있는 트리보기 항목이 포커스를 얻고 방금 한 작업을 취소합니다. 트리보기 항목에 IsTabStop이 false로 설정되어 있으므로 포커스를받을 수 있다는 것이 이상하지만 너무 해킹당했습니다. 텍스트 상자 LostFocus 이벤트에서 실제로 텍스트 상자에 포커스를 다시 지정한 다음 , IsTabStop을 false로 설정하십시오. – seekerOfKnowledge

1

@seekerOfKnowledge 그것을 포장 할 수 있습니다 다음 LostFocusIsTabStop를 비활성화하면 좋은 방법이지만, 재 초점 해킹은 필요하지 않습니다. IsTabStop의 변경 사항이 아직 적용되지 않았으므로 처음에는 눈에 띄는 효과가 없습니다. 이 접근법은 다른 컨트롤과 함께 사용할 수도 있습니다.

 var control = sender as Control; 
     if (control != null) 
     { 
      control.MouseLeftButtonDown += (sender, args) => 
       { //This event fires even if the control isn't allowed focus. 
        //As long as the control is visible, it's typically hit-testable. 
        if (!control.IsTabStop) 
        { 
         control.IsTabStop = true; 
         //threading required so IsTabStop change can take effect before assigning focus 
         control.Dispatcher.BeginInvoke(() => 
          { 
           control.Focus(); 
          }); 
        } 
       }; 

      control.LostFocus += (sender, args) => 
       { //Remove IsTabStop once the user exits the control 
        control.IsTabStop = false; 
       }; 
     }