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}"
表示绑定了sFontSize
的Value
属性。
+
和-
这两个按钮绑定的事件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"/>
最后效果如下
尽管我们的确得到了所有系统字体,但这些字体讲道理我们一个都不认识。而对于一个字体文件来说,除了英文名称外,还有不同语言的名称,封装在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;