以编程方式从WPF中的代码中删除删除线文本修饰

时间:2013-05-10 10:35:22

标签: c# .net wpf

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

我从后面的代码动态创建TextBlocks并将它们插入到StackPanel中。这项工作到目前为止。当用户将鼠标移到TextBlock上时,Strikthrough将应用于 textblock ,表示可以通过单击删除该项目。同样,这仍然有效。当鼠标离开文本块时,删除删除线,这里抛出异常,说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]);
}

非常感谢任何帮助。

谢谢, 贝恩德

3 个答案:

答案 0 :(得分:6)

我发现以下内容最适合我:

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);
}

显然这是为了删除下划线装饰,但我认为删除线也不例外。

答案 1 :(得分:5)

您可以将TextDecorations设置为null,这将清除Strikethrough

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

答案 2 :(得分:0)

我使用下面的代码删除了文本范围的下划线。同样适用于TextBlock。

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