2009-08-27 1 views
2

정말 거친 솔루션으로 해킹하기 전에 누군가 내가 올바른 방향으로 조금 움직일 수 있는지 알 것입니다.WPF RichTextBox - 선택한 텍스트를 사용자 정의 컨트롤로 바꾸기

정말로하고 싶은 것은 사용자가 RichTextBox에서 일부 텍스트를 선택하고 버튼을 클릭 한 다음 해당 텍스트를 사용자 정의 된 렌더링 된 컨트롤로 변환 할 수있게하려는 것입니다. 예를 들어 선택한 텍스트가 포함 된 Button으로 변환합니다.

답변

2

당신은 명령 및 CommandParameter

하여이 작업을 수행 할 수 있습니다

첫째, 같은 ICommand의 버튼을 결합 : 당신의 ViewModel 또는 컨트롤러 또는 뒤에 코드 또는 어디든지, 당신은 노출의 다음

<Button Content="Go" Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=myRichTextBox, Path=Selection}" /> 
<RichTextBox Name="myRichTextBox" /> 

속성으로 ICommand의, 그리고 방법을 가리 키는 ...

public ICommand MyCommand 
{ 
    get 
    { 
     if (_queryCommand == null) 
     { 
      _queryCommand = new RelayCommand<TextSelection>(DoWork); 
     } 
     return _queryCommand; 
    } 
} 

private void DoWork(TextSelection param) 
{ 
    string selectedText = param.Text; 

    // Build your control here... 
    // probably put it in an ObservableCollection<Control> which is bound by an Items Control, like a ListBox 
} 

주 작업과 같은 작업을 수행합니다 : 조쉬 스미스의 우수한에서 RelayCommand를 사용했다하지만 RoutedUICommand를 똑같이 사용할 수 있습니다 (명령에 입력 제스처를 연결시키는 추가 이점이 추가됩니다)

+0

는, 가산로 ... 난 그냥 시도와 RTB 컨트롤의 Selection.Path에 바인딩 실패했지만 미안 경로를 설정 한 경우 = 선택 : - 그건 당신이 서식있는 텍스트 상자 안에 컨트롤을 얻는 방법 , 그리고 System.Windows.Documents.TextSelection 유형의 내 RelayCommand를 만들고 (내 처리기가 동일한 유형의 매개 변수를 사용하도록) 잘 작동합니다. 내가 무슨 뜻인지 보여주기 위해 위 코드를 업데이트합니다. – kiwipom

0

선택을 취하고 InlineUIContainer로 래핑하는 코드가 필요할 것입니다

<RichTextBox> 
    <FlowDocument> 
     <Paragraph> 
      <Run>Fo</Run> 
      <InlineUIContainer> 
       <Button IsEnabled="True">oB</Button> 
      </InlineUIContainer> 
      <Run>ar</Run> 
     </Paragraph> 
    </FlowDocument> 
</RichTextBox> 
+0

안녕하세요 롭 :) 어 .. 그게 실제로 그가 * RichTextBox에서 컨트롤을 원하는 수도 있습니다 ... 좋은 대답 :) – kiwipom

+0

내 질문에 충분히 분명 아니었다. XAML에서 이것은 분명히 사소한 일 이었지만 여기에 표시된 결과 문서에 "FooBar"가 포함 된 이 하나 뿐인 경우 'oB'를 선택하는 사용자로부터 프로그램 방식으로 이동하는 방법이 궁금했습니다. –

+0

@IanR 감사합니다. 매우 유용합니다! – msfanboy