WPF RichTextBox - Замяна на избран текст с персонализиран контрол

Преди да започна да хаквам в едно наистина грубо решение, реших да видя дали някой може да ме тласне малко в правилната посока.

Това, което наистина искам да направя, е да позволя на потребителя да избере някакъв текст в RichTextBox, да щракне върху бутон и да преобразува този текст в персонализирана изобразена контрола. Преобразувайте го например в бутон, съдържащ текста, който са избрали.


person Community    schedule 27.08.2009    source източник


Отговори (2)


Можете да направите това с Command и CommandParameter

Първо обвържете бутона с ICommand, като:

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

След това във вашия ViewModel или Controller или Code-behind или където и да е, излагате 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 от отличната MVVM Foundation на Джош Смит, но можете също така да използвате RoutedUICommand например (което би добавило допълнителното предимство да ви позволи да свържете жестове за въвеждане към вашата команда)

person kiwipom    schedule 27.08.2009
comment
Съжалявам, като допълнение... Току-що се опитах и ​​не успях да се свържа с Selection.Path на RTB контролата, но ако задам Path=Selection и направя моята RelayCommand от тип System.Windows.Documents.TextSelection (и направя своя манипулатор взема параметър от същия тип) работи добре... Ще актуализирам кода по-горе, за да ви покажа какво имам предвид :) - person kiwipom; 27.08.2009

Ще трябва да напишете някакъв код, който взема вашия избор и го обгръща в InlineUIContainer - така получавате контроли в поле с форматиран текст:

<RichTextBox>
    <FlowDocument>
        <Paragraph>
            <Run>Fo</Run>
            <InlineUIContainer>
                <Button IsEnabled="True">oB</Button>
            </InlineUIContainer>
            <Run>ar</Run>
        </Paragraph>
    </FlowDocument>
</RichTextBox>
person Rob Fonseca-Ensor    schedule 27.08.2009
comment
Хей, Роб :) Хъ... никога не ми е хрумвало, че може да иска контрола всъщност в RichTextBox... хубав отговор :) - person kiwipom; 27.08.2009
comment
Предполагам, че не бях достатъчно ясен по въпроса си. Това очевидно е тривиално в XAML, но въпросът ми беше как програмно да премина от потребителя, който избира „oB“, когато има само един ‹Run›, съдържащ FooBar, до получения документ, който сте показали тук. - person ; 27.08.2009