UWP中DependencyProperty无法修改TextBlock的FontFamily问题求助
UWP打印报表中TextBlock的FontFamily属性无法通过依赖属性修改的问题
在UWP应用中打印包含TextBlock的报表时,希望根据用户偏好修改TextBlock的FontSize、FontStyle和FontFamily属性。使用DependencyProperty时,FontSize和FontStyle修改生效,但FontFamily未发生变化,需要解决该问题。
相关代码
XAML代码
<Page.DataContext> <vm:MainViewModel x:Name="mainViewModel" /> </Page.DataContext> <Paragraph> <InlineUIContainer> <ItemsControl ItemsSource="{Binding PrintArterialVelocities}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="2"/> <ColumnDefinition Width="175"/> <ColumnDefinition Width="80"/> <ColumnDefinition Width="173"/> <ColumnDefinition Width="175"/> <ColumnDefinition Width="80"/> </Grid.ColumnDefinitions> <Border BorderBrush="Black" BorderThickness="0,0,0,1" Grid.Column="1" Grid.ColumnSpan="2"/> <Border BorderBrush="Black" BorderThickness="0,0,0,1" Grid.Column="4" Grid.ColumnSpan="2"/> <TextBlock Grid.Column="1" local:VelocitiesText.Text="{Binding ArteryName}"/> <TextBlock Grid.Column="2" local:VelocitiesText.Text="{Binding ArteryVelocity}"/> <TextBlock Grid.Column="4" local:VelocitiesText.Text="{Binding ArteryName}"/> <TextBlock Grid.Column="5" local:VelocitiesText.Text="{Binding ArteryVelocity}"/> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </InlineUIContainer> </Paragraph>
回调类C#代码
public class VelocitiesText { public static string GetText(DependencyObject obj) { return (string)obj.GetValue(TextBlock.TextProperty); } public static void SetText(DependencyObject obj, string value) { obj.SetValue(TextBlock.TextProperty, value); } public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached("Text", typeof(string), typeof(VelocitiesText), new PropertyMetadata(string.Empty, callback)); public static void callback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var Txt = (TextBlock)d; var InsertString = (string)e.NewValue; Txt.Text = InsertString; // Txt.FontFamily= new Windows.UI.Xaml.Media.FontFamily(TextCalls.SelectedFontFamilyName); Txt.FontFamily= TextCalls.SelectedFontFamily; Txt.FontSize = double.Parse(TextCalls.SelectedFontSize); if (TextCalls.SelectedFontStyle == "Italic") Txt.FontStyle = Windows.UI.Text.FontStyle.Italic; } }
解决方案
1. 验证SelectedFontFamily的有效性
- 确认
TextCalls.SelectedFontFamily是正确初始化的FontFamily对象。可以先硬编码一个系统存在的字体测试,比如:
如果硬编码生效,说明原Txt.FontFamily = new Windows.UI.Xaml.Media.FontFamily("Arial");SelectedFontFamily对象存在问题,比如字体名称错误或未正确加载。
2. 清除继承的FontFamily值
TextBlock的FontFamily可能被父容器的样式、主题资源或模板默认值覆盖,可先清除原有值再设置:
Txt.ClearValue(TextBlock.FontFamilyProperty); Txt.FontFamily = TextCalls.SelectedFontFamily;
3. 延迟到控件加载完成后设置
DataTemplate中的控件初始化时,回调可能过早导致设置被后续逻辑覆盖,可注册Loaded事件延迟设置:
Txt.Loaded += (sender, args) => { var textBlock = sender as TextBlock; textBlock.FontFamily = TextCalls.SelectedFontFamily; };
4. 检查TextCalls静态属性的更新状态
确认用户修改偏好后,SelectedFontFamily已更新为最新的FontFamily实例。可在回调中打印验证:
Debug.WriteLine($"当前选中字体:{TextCalls.SelectedFontFamily.Source}");
内容的提问来源于stack exchange,提问作者Naweed Ashraf
相关产品推荐
相关产品推荐

