WPF开发txt阅读器4:字体控件绑定

文章目录

    • 控件折叠
    • 字体尺寸绑定
    • 选择字体
    • 字体的中文名称

txt阅读器系列:

  • 需求分析和文件读写
  • 目录提取类列表控件与目录

控件折叠

作为一个txt阅读器,至少能够设置文字字体、尺寸,段落行间距等,还得有护眼模式等一系列功能,这也是最开始设计UI的时候,留下右侧空白的原因。但这些设置并不需要一直显示,故而在工具栏中给了一个按钮,用于开启或关闭右侧边栏。

为按钮添加事件btnCloseRight_Click,内容为

private void btnCloseRight_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;
    bool flag = btn.Content.ToString() == "";
    btn.Content = flag ? "" : "";
    svRight.Visibility = flag ? Visibility.Visible : Visibility.Collapsed;
}

字体尺寸绑定

字体尺寸对阅读的影响是十分显著的,所以文本设置的第一条就是设置字体,其前端的设计逻辑如下

在这里插入图片描述

其中文本框中显示的是字体尺寸,+-号分别会让字体尺寸加一或者减一,而二者之间的滑动条则与文本框互相绑定,从而文本框显示的值就是滚动条中的值。具体实现方法如下

<StackPanel Orientation="Horizontal">
    <TextBlock Text="尺寸"/>
    <TextBox Width="50" Height="20" Text="{Binding Value, ElementName=sFontSize}"/>
    <Button Content="-" Width="20" Click="btnChangeFontSize_Click"/>
    <Slider x:Name="sFontSize" VerticalAlignment="Center" Width="150"
            Minimum="1" Maximum="100" Value="15" IsSnapToTickEnabled="True"/>
    <Button Content="+" Width="20" Click="btnChangeFontSize_Click"/>
StackPanel>

其中,Text="{Binding Value, ElementName=sFontSize}"表示绑定了sFontSizeValue属性。

+-这两个按钮绑定的事件btnChangeFontSize_Click内容如下

private void btnChangeFontSize_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;
    if (sFontSize.Value == 1)
        return;
    sFontSize.Value += btn.Content.ToString() == "+" ? 1 : -1;
}

此外,修改txt控件,将其FontSize也绑定到sFontSize上,具体变化为

<TextBox x:Name="txt" AcceptsReturn="True" TextWrapping="Wrap" 
         FontFamily="{Binding SelectedItem, Source=cbFont}"
         FontSize="{Binding Value, ElementName=sFontSize}"
         VerticalScrollBarVisibility="Auto"/>

效果如下

选择字体

字体就只有那么多种,选择字体显然用ComboBox比较合适,具体的控件设置如下

<StackPanel Orientation="Horizontal">
    <TextBlock Text="字体"/>
    <ComboBox x:Name="cbFont" Width="150"/>
StackPanel>

然后在C#中添加绑定代码

public MainWindow()
{
    InitializeComponent();
    init();
}

public void init()
{
    foreach (var fm in Fonts.SystemFontFamilies)
        cbFont.Items.Add(fm.Source);
    cbFont.SelectedIndex = 0;
}

通过cbFont.Items.Add逐个添加字体,并且修改txt,使之与字体相绑定

<TextBox x:Name="txt" AcceptsReturn="True" TextWrapping="Wrap" 
         FontFamily="{Binding SelectedItem, ElementName=cbFont}"
         FontSize="{Binding Value, ElementName=sFontSize}"
         VerticalScrollBarVisibility="Auto"/>

最后效果如下

WPF开发txt阅读器4:字体控件绑定_第1张图片

字体的中文名称

尽管我们的确得到了所有系统字体,但这些字体讲道理我们一个都不认识。而对于一个字体文件来说,除了英文名称外,还有不同语言的名称,封装在font.FamilyNames这个属性中。以中文为例,其对应的名称是zh-cn。为了得到中文名称,可以先创建一个中文的XmlLanguage,然后通过TryGetValue将中文名称试探性地输出到一个字符串中。这个TryGetValue的逻辑类似于int.TryParse,当转换成功时返回True,所以最终代码写成如下形式,这样一来,就可以显示所有中文字体了。

List<string> zhNames = new List<string>();
string tmpStr;
var ZH = XmlLanguage.GetLanguage("zh-cn");
foreach (var font in Fonts.SystemFontFamilies)
	if (font.FamilyNames.TryGetValue(ZH, out tmpStr))
		zhNames.Add(tmpStr);
cbFont.ItemsSource = zhNames;
cbFont.SelectedIndex = 0;

你可能感兴趣的:(.Net,wpf,C#,控件绑定,combobox,slider)