我需要以粗體顯示部分字串。由于 TextBlock 不支持以粗體顯示部分文本,因此我轉而使用 RichTextBox。現在,我希望 RichTextBox 限制為一行,如果內容更長以適合單行,則應使用字符省略號來截斷字串。以下是我系結到 RichTextBox 的 ViewModel,
public class SearchSuggestionViewModel : BindableBase, IComparable<SearchSuggestionViewModel>
{
private Suggestion _suggestion;
private string m_DocumentXaml = string.Empty;
public SearchSuggestionViewModel(Suggestion suggestion)
{
_suggestion = suggestion;
if (string.IsNullOrEmpty(suggestion.Text))
return;
string searchText = _suggestion.Text;
FlowDocument document = new FlowDocument();
Paragraph paragraph = new Paragraph();
Run run = new Run();
while (searchText.Contains("<b>"))
{
string initialText = searchText.Substring(0, searchText.IndexOf("<b>"));
run.Text = initialText;
paragraph.Inlines.Add(run);
searchText = searchText.Substring(searchText.IndexOf("<b>") "<b>".Length);
string boldText = searchText;
if (searchText.Contains("</b>"))
boldText = searchText.Substring(0, searchText.IndexOf("</b>"));
run = new Run();
run.FontWeight = FontWeights.Bold;
run.Text = boldText;
paragraph.Inlines.Add(run);
searchText = searchText.Substring(searchText.IndexOf("</b>") "</b>".Length);
}
run = new Run();
run.Text = searchText;
paragraph.Inlines.Add(run);
document.Blocks.Add(paragraph);
DocumentXaml = XamlWriter.Save(document);
}
public string Id
{
get
{
return _suggestion.Id;
}
}
public string SearchSuggestionText
{
get
{
if (!string.IsNullOrWhiteSpace( _suggestion.Text))
return _suggestion.Text.Replace("<b>", "").Replace("</b>", "");
return string.Empty;
}
}
/// <summary>
/// The text from the FsRichTextBox, as a XAML markup string.
/// </summary>
public string DocumentXaml
{
get
{
return m_DocumentXaml;
}
set
{
SetProperty(ref m_DocumentXaml, value, nameof(DocumentXaml));
}
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override bool Equals(object obj)
{
if (!(obj is SearchSuggestionViewModel))
return false;
SearchSuggestionViewModel otherTag = (SearchSuggestionViewModel)obj;
if (SearchSuggestionText.Equals(otherTag.SearchSuggestionText))
return true;
return false;
}
public int CompareTo(SearchSuggestionViewModel compareSearchSuggestionViewModel)
{
// A null value means that this object is greater.
if (compareSearchSuggestionViewModel == null)
return 1;
else
return this.SearchSuggestionText.CompareTo(compareSearchSuggestionViewModel.SearchSuggestionText);
}
public override string ToString()
{
return _suggestion.Text;
}
}
關于如何在行結束之前實作字符省略的任何建議。
問候, 奧馬爾
uj5u.com熱心網友回復:
您應該能夠使用TextBlock帶有文本換行和文本修剪的 a:
<TextBlock TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis">
<Run>This text is</Run>
<Run FontWeight="Bold" Text="partly bold"/>
<Run>and wraps.</Run>
</TextBlock>
如果您以TextBlock編程方式創建,它有一個Inlines屬性,您可以向其中添加Run元素。
uj5u.com熱心網友回復:
感謝mm8,他的回答給了我一個方向。但我需要一個解決方案來系結到 ViewModel 的集合。并且字串中粗體的數量是在運行時決定的。所以,我創建了一個依賴屬性。以下為我作業。共享,造福他人。
文本塊擴展.cs
public class TextBlockExtensions
{
public static IEnumerable<Inline> GetBindableInlines(DependencyObject obj)
{
return (IEnumerable<Inline>)obj.GetValue(BindableInlinesProperty);
}
public static void SetBindableInlines(DependencyObject obj, IEnumerable<Inline> value)
{
obj.SetValue(BindableInlinesProperty, value);
}
public static readonly DependencyProperty BindableInlinesProperty =
DependencyProperty.RegisterAttached("BindableInlines", typeof(IEnumerable<Inline>), typeof(TextBlockExtensions), new PropertyMetadata(null, OnBindableInlinesChanged));
private static void OnBindableInlinesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var Target = d as TextBlock;
if (Target != null)
{
Target.Inlines.Clear();
Target.Inlines.AddRange((System.Collections.IEnumerable)e.NewValue);
}
}
}
在我的 ViewModel 中,我添加了,
private ObservableCollection<Inline> _searchSuggestionInlines;
public ObservableCollection<Inline> SearchSuggestionInlines
{
get
{
return _searchSuggestionInlines;
}
set
{
SetProperty(ref _searchSuggestionInlines, value, nameof(SearchSuggestionInlines));
}
}
//To populate the inlines
public SearchSuggestionViewModel(Suggestion suggestion)
{
_suggestion = suggestion;
if (string.IsNullOrEmpty(suggestion.Text))
return;
string searchText = _suggestion.Text;
ObservableCollection<Inline> inlines = new ObservableCollection<Inline>();
Run run = new();
while (searchText.Contains("<b>"))
{
string initialText = searchText.Substring(0, searchText.IndexOf("<b>"));
run.Text = initialText;
inlines.Add(run);
searchText = searchText.Substring(searchText.IndexOf("<b>") "<b>".Length);
string boldText = searchText;
if (searchText.Contains("</b>"))
boldText = searchText.Substring(0, searchText.IndexOf("</b>"));
run = new Run
{
FontWeight = FontWeights.Bold,
Text = boldText
};
inlines.Add(run);
searchText = searchText.Substring(searchText.IndexOf("</b>") "</b>".Length);
}
run = new Run
{
Text = searchText
};
inlines.Add(run);
SearchSuggestionInlines = inlines;
}
雖然以下內容已添加到視圖中,
<TextBlock controls:TextBlockExtensions.BindableInlines="{Binding Path=SearchSuggestionInlines, Mode=OneWay}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" ToolTip="{Binding Path=SearchSuggestionText, Mode=OneWay}"/>
問候,
奧馬爾
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/360011.html
