我已經看到一些問題解決了這個問題域和處理下劃線的不必要的復雜性(主要是應用它們,但我想檢測它們),但是我記得沒有一個問題,因為我在這里建議完成這個的默認策略創建不合邏輯假陰性。此外,我之前提到的大多數問題都使用了不同的控制元件(例如 TextBlock)和/或具有過時的語法。
問題
(.NET Core 3.1)我只想以編程方式檢測 WPF RichTextBox 選擇是否包含任何 TextDecorations,但除錯顯示 TextDecorationCollection 始終為空,即使選擇全部帶有下劃線也是如此。
如您所見,即使在檢查帶下劃線的行內(運行)時,TextDecorationCollection 也會回傳空
對于背景關系,此螢屏截圖僅顯示 FlowDocument 的純文本表示
我試過的
1
TextRange myrange = new TextRange(MainRtb.Selection.Start, MainRtb.Selection.End);
if (myrange.GetPropertyValue(Inline.TextDecorationsProperty).Equals(TextDecorations.Underline)) { }
2
TextRange myrange = new TextRange(MainRtb.Selection.Start, MainRtb.Selection.End);
var obj = myrange.GetPropertyValue(Inline.TextDecorationsProperty);
if (obj == DependencyProperty.UnsetValue) {
log.addLog("mix format");
}
if (obj is TextDecorationCollection) {
var objProper = obj as TextDecorationCollection;
if (objProper.Count > 0) {
log.addLog("all underlined");
} else {
log.addLog("none underlined");
}
}
3
foreach (Block block in MainRtb.Document.Blocks) {
Paragraph p = block as Paragraph;
if (p != null) {
foreach (Inline inline in p.Inlines) {
InlineUIContainer iuic = inline as InlineUIContainer;
if (iuic != null) {
Console.WriteLine("found underline");
}
}
}
}
理論
這篇文章https://social.msdn.microsoft.com/Forums/vstudio/en-US/3ac626cf-60aa-427f-80e9-794f3775a70e/how-to-tell-if-richtextbox-selection-is-underlined?forum= wpf建議
myrange.GetPropertyValue(Inline.TextDecorationsProperty)
由于“GetPropertyValue()”方法內部的問題而無法正常作業,但這是一個非常古老的帖子。我不能完全運行 Jim 的解決方案,因為他初始化了一個“IEnumerable”,現在需要用某種型別宣告它——至少 VS2019 是這么說的。
測驗 Rtf 檔案: https ://docs.google.com/document/d/1YQmGsPcH4hX2XsP7KBdFqTFg4XjrSv8I/edit?usp=sharing&ouid=111968029811979231347&rtpof=true&sd=true
uj5u.com熱心網友回復:
嘗試以下方法:
public static void GetDecorations(RichTextBox rtb)
{
TextDecorationCollection decors = rtb.Selection.GetPropertyValue(Inline.TextDecorationsProperty) as TextDecorationCollection;
if (decors == null || decors.Count == 0)
{
if (rtb.Selection.Start.Parent is Run run)
{
if (run.Parent is Span span)
{
decors = span.TextDecorations;
}
else if (run.Parent is Paragraph para)
{
decors = para.TextDecorations;
}
}
}
if (decors is TextDecorationCollection tdc)
{
// TODO: Processing decorations...
}
}
我想您發現的問題與FlowDocument
加載 RTF 檔案后的特定結構有關,可能描述如下。
為帶下劃線的文本加載 RTF 檔案時,會為此文本創建tBox. See TextPointer for more information on text position terminology like "insertion position"
一個Run
行內,但該Run.TextDecorations
屬性不包含該文本的實際裝飾。而不是裝飾設定存盤在Span
包含 this 的父物件中Run
。換句話說,這些裝飾屬性是從父級繼承到子級的。
因此,如果當前物件沒有設定裝飾屬性Run
,那么您應該檢查TextDecorations
父物件中的屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496850.html