程序性地从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
您可以将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);