程序性地从WPF后面的代码中删除划线文本装饰

本文关键字:删除 文本 代码 WPF 程序性 | 更新日期: 2023-09-27 18:13:11

我在WPF桌面应用程序中实现以下行为时遇到问题:

我动态地从代码后面创建textblock并将它们插入到StackPanel中。到目前为止,这是可行的。当用户将鼠标移动到文本块上时,文本块将被应用一个取消线,表示可以通过点击删除该条目。同样,这仍然有效。当鼠标离开文本块时,该划线将被删除,并且在这里抛出异常,表示必须将IsFrozen设置为false才能更改TextDecorationCollection对象。我不知道如何绕过这个。

下面是我的代码:

private void HandleAddedSecondaryDxMouseEnter(Object sender, MouseEventArgs e) {
    TextBlock tbl = (TextBlock)sender;
    tbl.TextDecorations = TextDecorations.Strikethrough;
}
private void HandleAddedSecondaryDxMouseLeave(Object sender, MouseEventArgs e) {
    TextBlock tbl = (TextBlock)sender;
    tbl.TextDecorations.Remove(tbl.TextDecorations[0]);
}

任何帮助都将是非常感激的。

谢谢,Bernd

程序性地从WPF后面的代码中删除划线文本装饰

您可以将TextDecorations设置为null,这将从TextBlock中清除Strikethrough装饰

private void HandleAddedSecondaryDxMouseLeave(Object sender, MouseEventArgs e)
{
    TextBlock tbl = (TextBlock)sender;
    tbl.TextDecorations = null;
}

我发现以下方法最适合我:

TextDecorationCollection decs = (TextDecorationCollection)theRTB.Selection.GetPropertyValue( Inline.TextDecorationsProperty );
if (decs.Contains(TextDecorations.Underline[0]))
{
    TextDecorationCollection noUnder = new TextDecorationCollection(decs);
    noUnder.Remove(TextDecorations.Underline[0]);  //this is a bool, and could replace Contains above
    theRTB.Selection.ApplyPropertyValue(Inline.TextDecorationsProperty, noUnder);
}

显然,这是为了删除下划线装饰,但我想,划线也没有什么不同。

我使用下面的代码来删除文本范围的下划线。同样应该为TextBlock工作,以及。

TextDecorationCollection textDecorations;
(textRange.GetPropertyValue(Inline.TextDecorationsProperty) as TextDecorationCollection).TryRemove(TextDecorations.Underline, out textDecorations);
textRange.ApplyPropertyValue(Inline.TextDecorationsProperty, textDecorations);

以下代码不清除其他装饰:

TextDecorationCollection newTextDecoration;
if (richTextBox.Selection.GetPropertyValue(Inline.TextDecorationsProperty) is TextDecorationCollection currentTextDecoration)
{
    newTextDecoration = new TextDecorationCollection();
    bool found = false;
    foreach (TextDecoration decoration in currentTextDecoration)
    {
        if (decoration == TextDecorations.Strikethrough[0])
            found = true;
        else
            newTextDecoration.Add(decoration);
    }
    if (!found)
        newTextDecoration.Add(TextDecorations.Strikethrough[0]);
    newTextDecoration.Freeze();
}
else
{
    newTextDecoration = TextDecorations.Strikethrough;
}
richTextBox.Selection.ApplyPropertyValue(Inline.TextDecorationsProperty, newTextDecoration);