2011-09-22 4 views
0

에 초점에도 불구하고 발사 명령.WPF는 감안할 때 윈폼의 텍스트 상자

WinFormsTextBox에 대해 WpfTextBox의 동작을 사용하고 싶습니다. 나는. 명령은 아무 것도 초점이 없을 때만 발동해야합니다. 전역보기 명령 또는 그와 비슷한 방식으로 작동해야합니다.

참고 :에 일어나는 것을 방지 하나로 명령의 CanExecute 이벤트에만 보조에 대한 처리기를 추가하기 WinFormsTextBox (Ctrl 키 + e.CanExecutetrue로 설정되어있는 경우 완전히 삼킨 X- 텍스트가 절단되지 않습니다 의미) , 또는 정상적으로 수행됩니다.

참고 2 : 잘라 내기가 하나의 예일 뿐이므로 모든 명령 바인딩에 사용할 수있는 솔루션이 필요합니다.

참고 3 : 명령에 포커스가있는 경우 ListView 등의 다른 컨트롤에서 명령을 실행할 수 있어야합니다. 내부에 포커스가있는 TextBox가 없다면 (편집 모드로 생각하십시오).

실제로 수행 할 수있는 것이 확실하지 않지만 CommandBinding_Executed 메서드에서 특정 처리를 추가하지 않아도됩니다. 하지만 C'est la vie.

답변

0

약간 바보 같은 문제에 대한 약간 바보 같은 해결책. 이것은 나의 최종 솔루션의 간단한 버전 :

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.ContinueRouting = IsFocusInWinFormsInputControl(); 
} 

private static bool IsFocusInWinFormsInputControl() 
{ 
    // Try get focus control 
    WinForms.Control focusedWinFormsControl = GetFocusedWinFormsControl(); 

    // Is there anything and is it a textbox etc? 
    return focusedWinFormsControl != null && 
     (focusedWinFormsControl is WinForms.TextBox || 
     focusedWinFormsControl is WinForms.RichTextBox); 
} 

private static WinForms.Control GetFocusedWinFormsControl() 
{ 
    // Try get focused WinForms control 
    IntPtr focusedControlHandle = GetFocus(); 

    WinForms.Control focusedControl = null; 
    if (focusedControlHandle != IntPtr.Zero) 
    { 
     // Note: If focused Control is not a WinForms control, this will return null 
     focusedControl = WinForms.Control.FromHandle(focusedControlHandle); 
    } 

    return focusedControl; 
} 

[DllImport("user32.dll")] 
private static extern IntPtr GetFocus(); 

기본적으로, 우리는 윈폼의 텍스트 상자 외부에있는 경우에만 명령을 실행 명령을 검증 로직을 추가 할 수 있습니다.

0

WPF 명령이 라우팅되고 WindowsFormsHost의 부모 컨트롤에서 Ctrl + X 명령에 대한 CommandBinding을 정의했습니다. 그래서 당신이 그리드에서 CommandBinding을 제거하고 거기에 넣어에만 WPF의 텍스트 상자에 처리하려는 경우 :

명령이 전달됩니다 마찬가지로 Ctrl + X 명령은 첫 번째 부모가를함으로써 처리됩니다
<TextBox>  
    <TextBox.CommandBindings> 
     <CommandBinding Command="Cut" 
         Executed="CommandBinding_Executed"/> 
    </TextBox.CommandBindings> 
</TextBox> 

이 명령의 바인딩. 초점이 Grid의 범위에 있고 Ctrl + X 명령을 실행하면 Grid 명령 바인딩이이를 처리합니다. 여기


는 WPF의 라우팅 된 이벤트와 명령에 대한 훌륭한 기사입니다 : Understanding Routed Events and Commands In WPF


편집 :

명령을하지 않으려면가 처리 될 수 TextBox 그러면 CommandBindings를 정의해야합니다. Ctrl + X만이 의미가 있습니다. 나는 네가 다른 해결책을 가지고 있다고 생각하지 않는다. 어쨌든, 일반적으로 Cut과 같은 ApplicationCommands는 RichTextBox 나 ListBox와 같은 특정 범위에 대한 문맥입니다.


편집 :

당신은 라우팅 명령을 기본 발사 WindowsFormsHost 차단할 수 없습니다.그러나 당신이 할 수있는 것은있는 CommandBindings 범위에서 호스트를 제거하는 단지입니다 : 물론

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Grid Grid.Column="0"> 
     <Grid.CommandBindings> 
      <CommandBinding Command="Cut" 
          Executed="CommandBinding_Executed"/> 
     </Grid.CommandBindings> 

     <TextBox x:Name="WpfTextBox" 
       VerticalAlignment="Center" 
       Text="Hello there" /> 
    </Grid> 

    <WindowsFormsHost Grid.Column="1" 
         VerticalAlignment="Center"> 
     <wf:TextBox x:Name="WinFormsTextBox" 
        Text="Hello there" /> 
    </WindowsFormsHost> 
</Grid> 

당신이 약간 까다로울 수있다 레이아웃에 더 많은 개체가 있지만 작동합니다. CommandBindings의 범위에서 명령을 처리하지 않으려는 개체를 제거하기 만하면됩니다.

+0

두 개의 텍스트 상자에서 명령을 실행하지 않으려합니다. TextBox 외부에있을 때 발생합니다. 죄송합니다. 예제가 약간 오도 된 것을 보았습니다. 편집하려고 시도합니다. – Locdarb

+0

내 최종 목표는 논리적으로 코드로 정의 된 명령에 대한 컨텍스트를 표시하는 것입니다.하지만 명령이 수행 할 작업과 수행 할 작업을 표시하거나 알려주는 일종의 adorner UI가 있습니다. 그 대답의 일반성에 대해 유감스럽게 생각하지만, 나는 당신이 내가하려고하는 것을 볼 수 있도록 도와 줄 수 있기를 바랍니다. CommanBindings 또는 WinForms를 사용하여 포기해야 할 수도 있습니다. – Locdarb

+0

글쎄, 특정 UI 범위 내에서 명령을 활성화하고 싶지만이 범위 내의 특정 컨트롤에서 명령을 처리하지 않으려한다는 것을 알고 있습니다. 그것이 당신이 정말로 원하는 것이라면, 조금 복잡합니다. CommandBinding은 UI 범위에서 명령을 전역 적으로 활성화하려는 경우 사용할 수있는 방법입니다. 또한이 문제는 WinForms와 관련이 없습니다. 여기서 WPF 명령 체계에 대해 자세히 살펴보고이 문제가 정상적인 이유를 이해할 것을 제안합니다. – Ucodia