3

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

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

任何帮助将不胜感激。

谢谢,伯恩德

4

3 回答 3

8

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

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

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

于 2014-08-30T10:34:45.717 回答
5

您可以将 设置TextDecorationsnull,这Strikethrough将从TextBlock

private void HandleAddedSecondaryDxMouseLeave(Object sender, MouseEventArgs e)
{
    TextBlock tbl = (TextBlock)sender;
    tbl.TextDecorations = null;
}
于 2013-05-11T00:34:55.787 回答
0

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

TextDecorationCollection textDecorations;
(textRange.GetPropertyValue(Inline.TextDecorationsProperty) as TextDecorationCollection).TryRemove(TextDecorations.Underline, out textDecorations);
textRange.ApplyPropertyValue(Inline.TextDecorationsProperty, textDecorations);
于 2017-07-21T12:08:25.777 回答