如何在Avalonia的ComboBox中添加字体?按文档操作未生效求助
Avalonia ComboBox加载系统字体不生效问题修复
按照Avalonia官方文档实现ComboBox加载系统字体,但运行后无效果,该实现逻辑和WPF差异较大,以下是问题代码及解决方法:
问题代码
XAML代码
<Window xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="AvaloniaAppTemplate.MainWindow" Title="AvaloniaAppTemplate"> <StackPanel> <ComboBox x:Name="fontComboBox" SelectedIndex="0"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" FontFamily="{Binding}" /> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </StackPanel>
后台C#代码
var fontComboBox = this.Find<ComboBox>("fontComboBox"); fontComboBox.Items = FontManager.Current.GetInstalledFontFamilyNames().Select(x => new FontFamily(x)); fontComboBox.SelectedIndex = 0;
解决方法
1. 调整代码执行时机
将字体加载逻辑放在窗口的OnLoaded事件中执行,避免控件未完全初始化导致赋值无效:
protected override void OnLoaded(RoutedEventArgs e) { base.OnLoaded(e); var fontComboBox = this.Find<ComboBox>("fontComboBox"); // 指定获取常规字重的字体名称,确保返回有效字体 var fontNames = FontManager.Current.GetInstalledFontFamilyNames(FontFamilyNamesKey.Regular); fontComboBox.Items = fontNames.Select(name => new FontFamily(name)).ToList(); fontComboBox.SelectedIndex = 0; }
2. 优化绑定逻辑(可选)
如果仍有问题,可显式指定FontFamily的绑定路径,避免潜在类型转换问题:
<TextBlock Text="{Binding Name}" FontFamily="{Binding Name}" />
3. 确认FontManager初始化(针对Avalonia 0.10+版本)
在Program.cs中确保正确配置FontManager:
public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure<App>() .UsePlatformDetect() .LogToTrace() .With(new FontManagerOptions { DefaultFamilyName = "Segoe UI" });
内容的提问来源于stack exchange,提问作者LeanBlasto
相关产品推荐
相关产品推荐

