我正在尝试生成一个 FlowDocument,并希望在某些文本运行包含特定字符串时突出显示它们。我正在使用BindableRun类来确保我可以更新 Run 文本值(尽管我只在构造时设置它们,所以 Run 的 vanilla 实例应该没问题)。
本质上,我想这样做:
<FlowDocument Name="FlowDoc" FontFamily="{x:Static SystemFonts.CaptionFontFamily}"
Background="{x:Static SystemColors.ControlBrush}"
FontSize="{x:Static SystemFonts.SmallCaptionFontSize}"
TextAlignment="Left">
<FlowDocument.Resources>
<Style TargetType="{x:Type local:BindableRun}">
<!-- 1. Style all BindableRuns with a pink background by default -->
<Setter Property="Background" Value="HotPink"/>
<Style.Triggers>
<!-- 2. Style BindableRuns where Text=Hello to have a green background-->
<DataTrigger Binding="{Binding BoundText}" Value="Hello">
<Setter Property="Background" Value="GreenYellow"/>
</DataTrigger>
<!-- 3. Fire a Datatrigger with parameterised converter to change
text to Orange if the text contains 'StackOverflow'-->
<DataTrigger Binding="{Binding BoundText,
Converter={StaticResource ContainsBoolConverter},
ConverterParameter=StackOverflow}" Value="False">
<Setter Property="Foreground" Value="Orange"/>
</DataTrigger>
</Style.Triggers>
</Style>
</FlowDocument.Resources>
</FlowDocument>
现在,当我尝试使用上面的 Xaml 时:
• 更改BindableRun 对象(即#1)背景的样式效果很好——因此FlowDocument 的内容是我所期望的
• 针对 BindableRun 对象的 BountText 属性的 DataTriggers 不起作用。
• 转换器甚至没有被调用(我已经在它上面设置了一个断点),所以看起来绑定/数据触发器只是没有触发。
以前有人做过这样的事情吗?如果是这样,你有没有设法让它工作?关于 SO 等的 FlowDocument 示例并不多,因此我没有设法追踪任何其他尝试(无论成功与否)在 Run 的 Text 属性上使用 DataTriggers 的人。
作为参考,这是我正在使用的 Contains 转换器(尽管它根本不会触发,所以它是否正确并不重要;))。
public class ContainsTextConverter : IValueConverter
{
public object Convert( object value, Type t, object parameter, CultureInfo culture )
{
String input = value.ToString();
string param = parameter.ToString();
return input.IndexOf( param, StringComparison.OrdinalIgnoreCase ) != -1;
}
public object ConvertBack( object value, Type t, object parameter, CultureInfo culture )
{
// Don't care about this
throw new NotSupportedException();
}
};