目前有一DataGrid控件,其中的字符来源于后台代码,是字符串绑定到DataGridTextColum控件上
前台XAML代码绑定后台字符串 S
<DataGridTextColum Width="Auto" MinWidth="200" Binding=“”{Binding S}>
<DataGridTextColum.Header>
<TextBlock Text="{DynamicResource 符号}" FontWeight="Bold" Margin="30 0 0 0"/>
</DataGridTextColum.Header>
</DataGridTextColum>
后台代码中的 S
//实现INotifyPropertyChanged接口
[field: NoSerializedAttribute()]
#pragma warning disable CS1591
public event PropertyChangedEventHandler PropertyChanged;
#pragma warning restore CS1591
public virtual void OnPropertyChanged([CallerMemberName] string propertyName=nall)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propertyName));
}
private string s;
public string S
{
get
{
return s;
}
set
{
s=value;
OnProPertyChanged("S");
}
}
现预期使部分符号转换为角标形式,实现思路为将原本的绑定字符串改为绑定Paragraph,在Paragraph中根据需求添加多个Run,根据需求将Run的的样式设置为角标。
修改前台控件为如下:
<DataGridTemplateColum Width="Auto" MinWidth="200">
<DataGridTemplateColum.Header>
<TextBlock Text="{DynamicResource 符号}" FontWeight="Bold" Margin="30 0 0 0"/>
</DataGridTemplateColum.Header>
<DataGridTemplateColum.CellTemplate>
<DataTemplate>
<FlowDocumentScrollViewer Document="{Binding S,Converter={StaticResource ParagraphToFlowDocumentConverter}}"
VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" IsHitTestVisible="False"
Width="300" Margin="10 -15 10 0"/>
</DataTemplate>
</DataGridTemplateColum.CellTemplate>
</DataGridTemplateColum>
ParagraphToFlowDocumentConverter值转换器内容
public class ParagraphToFlowDocumentConverter:IValueConverter
{
public object Conver(object value,Type targetType,object paramter,CultureInfo culture)
{
if(value is Paragraph paragraph)
{
var flowDocument = new FlowDocument();
flowDocument.Blocks.Add(paragraph);
return flowDocument;
}
return null;
}
public object ConvertBack(object value,Type targetType,object parameter,CultureInfo culture)
{
throw new NotImplementedException():
}
修改后台 S 类型
private Paragraph s;
public Paragraph S
{
get
{
return s;
}
set
{
s=value;
OnProPertyChanged("S");
}
}
有参构造函数中
public Ca(string n)
{
if(判断条件)
{
S=...//此处根据需求将字符串中某些符号改为角标
//思路为将单个字符放于Run中
Run run=new Run(截取的需要变角标的字符串);
//再根据需求设置run的样式Style,随后放入paragraph
Paragraph paragraph=new Paragraph();
paragraph.Inlines.Add(run);
}
else
{
Run run=new Run(n);
S=new Paragraph(run);
}