In Ordnung, ich habe eine Lösung gefunden, die für meinen Fall funktioniert - aber möglicherweise nicht für jeden funktioniert, der so etwas möchte. Es ist unordentlich, aber es macht den Job.
Ich werde meine eigene Antwort für ein paar Tage nicht akzeptieren, nur für den Fall, dass jemand anders einen besseren Weg hat, dies zu erreichen.
Hier gehen wir zunächst die XAML:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="500"
Width="600">
<DockPanel LastChildFill="True">
<RichTextBox x:Name="rtb"
FontFamily="Courier New"
FontSize="14"
PreviewKeyDown="rtb_PreviewKeyDown">
<FlowDocument>
<Paragraph>
<InlineUIContainer Unloaded="InlineUIContainer_Unloaded">
<TextBlock FontFamily="Courier New" FontSize="14">This line of text is not editable.</TextBlock>
</InlineUIContainer>
<Run Foreground="Blue">But this is editable.</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
</DockPanel>
</Window>
Und den Code hinter:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void InlineUIContainer_Unloaded(object sender, RoutedEventArgs e)
{
(sender as InlineUIContainer).Unloaded -= new RoutedEventHandler(InlineUIContainer_Unloaded);
TextBlock tb = new TextBlock();
tb.FontFamily = new FontFamily("Courier New");
tb.FontSize = 14;
tb.Text = "This line of text is not editable.";
TextPointer tp = rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Forward);
InlineUIContainer iuic = new InlineUIContainer(tb, tp);
iuic.Unloaded += new RoutedEventHandler(InlineUIContainer_Unloaded);
}
private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
var newPointer = rtb.Selection.Start.InsertLineBreak();
rtb.Selection.Select(newPointer, newPointer);
e.Handled = true;
}
}
}
}
Meine Lösung beruht auf der Tatsache, dass, wenn ein InlineUIContainer
von der Benutzeroberfläche entfernt wird, ist es Unloaded()
Methode wird aufgerufen. An diesem Punkt lege ich einfach die gelöschte InlineUIContainer
an der aktuellen Caret-Position wieder ein.
Wie bei jedem Hack gibt es eine Reihe von Nachteilen. Die folgenden Nachteile sind die folgenden:
- Der Text, den ich schreibgeschützt sein möchte, muss in eine
InlineUIContainer
verpackt werden. Das ist ein wenig einschränkend für diese Lösung.
- Ich muss die 'Enter'-Taste erfassen und Zeilenumbrüche manuell einfügen, ansonsten wird
InlineUIContainer.Unloaded()
immer ausgelöst, wenn die Eingabetaste gedrückt wird. Nicht lustig, aber es funktioniert für meinen Fall.
Es ist keine großartige Lösung, aber ich denke, es wird für mich arbeiten. Wie ich schon sagte, werde ich das hier nicht als eine Antwort auf meine eigene Frage bezeichnen - hoffentlich wird jemand anderes einen besseren Weg finden, dies zu tun.
Sehr interessant es mir hinzufügen helfen "Widgets", wenn Sie in den Texteditor gehen. Ich mache einen sehr schönen Windows-Wiki-Editor. Zum Hinzufügen von Bildern, Kategorien und Schlüsselwörtern verwende ich kleine Objekte, die das Rich Text-Objekt dekorieren. Ich wünschte, der Redakteur wäre ein bisschen mehr wie der Redakteur des visuellen Studios. Auf diese Weise konnte ich "Verzierungen" hinzufügen, aber ... das hat mir definitiv geholfen! Vielen Dank. – JustinKaz
Ich bin froh, dass es helfen könnte - seien Sie gewarnt, aber - ich erinnere mich vage daran, dass es möglich ist, schreibgeschützten Text mit der Rücktaste zu löschen.Nach dieser ganzen Zeit bin ich mir nicht sicher, aber ich würde es gründlich testen, um sicherzustellen, dass die Widgets schreibgeschützt bleiben. –