• Windows Phone开发经验谈(15)动态的改变APP的字体大小


        虽然Windows Phone 8快要出来了...但是丝毫不能使我减少对WP7的研究...这次教大家如何动态改变APP的字体大小,想看具体的演示可以去windows phone市场下载 公交路线查询http://www.windowsphone.com/?appsid=384ba16d-d30f-44a5-9a8e-e395eea269df 

        我在公交路线查询里面设置了3种的字体大小(大,中,小) 我用一个枚举来表示

        public enum FontSizePattern
        {
            Small = 0,
            Middle,
            Large
        }

       但是大家要知道,虽然字体分为了大、中、小,但是很多地方的字体显示大小还是不一样的,所以任何一种字体大小里面还要设置不同的字体SIZE,这里我把字体大小的配置写成XAML文件

       large.xaml

    <ResourceDictionary
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
        >
    
        <sys:Double x:Key="FontSize18">22.4</sys:Double>
        <sys:Double x:Key="FontSize22">26.4</sys:Double>
        <sys:Double x:Key="FontSize24">28.8</sys:Double>
        <sys:Double x:Key="FontSize30">32.8</sys:Double>
        <sys:Double x:Key="FontSize36">43.2</sys:Double>
        <sys:Double x:Key="FontSize48">57.6</sys:Double>
        <sys:Double x:Key="FontSize60">72.0</sys:Double>
        <sys:Double x:Key="FontSize72">86.4</sys:Double>
    
    </ResourceDictionary>
    
      

    middle.xaml

    <ResourceDictionary
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
        >
        <sys:Double x:Key="FontSize18">22.0</sys:Double>
        <sys:Double x:Key="FontSize22">22.0</sys:Double>
        <sys:Double x:Key="FontSize24">24.0</sys:Double>
        <sys:Double x:Key="FontSize30">28.0</sys:Double>
        <sys:Double x:Key="FontSize36">36.0</sys:Double>
        <sys:Double x:Key="FontSize48">48.0</sys:Double>
        <sys:Double x:Key="FontSize60">60.0</sys:Double>
        <sys:Double x:Key="FontSize72">72.0</sys:Double>
    
    </ResourceDictionary>

    small.xaml

    <ResourceDictionary
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
        >
    
        <sys:Double x:Key="FontSize18">16.6</sys:Double>
        <sys:Double x:Key="FontSize22">17.6</sys:Double>
        <sys:Double x:Key="FontSize24">19.2</sys:Double>
        <sys:Double x:Key="FontSize30">23.8</sys:Double>
        <sys:Double x:Key="FontSize36">28.8</sys:Double>
        <sys:Double x:Key="FontSize48">38.4</sys:Double>
        <sys:Double x:Key="FontSize60">48.0</sys:Double>
        <sys:Double x:Key="FontSize72">57.6</sys:Double>
    
    </ResourceDictionary>
    
      

    现在我们要做的是用户选择不同的字体的时候加载不同的xaml文件就可以了,接下来我们来创建一个类Configuration 用来存储用户的配置信息同样用到了AppSettingHelper这个类,可以去Windows Phone开发经验谈(14)-动态的改变APP的语言里面获取...下面是Configuration的代码

    using System.ComponentModel;
    namespace ChinaBus.Utility
    {
    
    
    
        public class Configuration : INotifyPropertyChanged
        {
    
    
            Configuration()
            {
           this._fontSizePattern = AppSettingHelper.GetValueOrDefault<FontSizePattern>("FontSizePattern", FontSizePattern.Small);
                    this._themesPattern = AppSettingHelper.GetValueOrDefault<ThemesPattern>("ThemesPattern", ThemesPattern.Blue);
    
            }
    
            private static Configuration _instance;
            public static Configuration Instance
            {
                get
                {
                    if (Configuration._instance == null)
                    {
                        Configuration._instance = new Configuration();
                    }
                    return Configuration._instance;
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            private ThemesPattern _themesPattern;
            public ThemesPattern ThemesPattern
            {
                get
                {
                    return this._themesPattern;
                }
                set
                {
                    if (this._themesPattern != value)
                    {
                        this._themesPattern = value;
                        this.UpdateValue("ThemesPattern", value);
                        this.OnPropertyChanged("ThemesPattern");
                    }
                }
            }
            private FontSizePattern _fontSizePattern;
            public FontSizePattern FontSizePattern
            {
                get
                {
                    return this._fontSizePattern;
                }
                set
                {
                    if (this._fontSizePattern != value)
                    {
                        this._fontSizePattern = value;
                        this.UpdateValue("FontSizePattern", value);
                        this.OnPropertyChanged("FontSizePattern");
                    }
                }
            }
            private void UpdateValue(string key, object value)
            {
                AppSettingHelper.AddOrUpdateValue(key, value);
            }
    
        }
    }

    这时候再创建一个类叫做FontSizeProvider 用来加载xaml获取各种字体的大小,下面是完整的代码。

    using System;
    using System.ComponentModel;
    using System.Windows;
    using System.IO.IsolatedStorage;
    
    namespace ChinaBus.Utility
    {
        public class FontSizeProvider : INotifyPropertyChanged
        {
            private double _fontSize18;
            private double _fontSize22;
            private double _fontSize24;
            private double _fontSize30;
            private double _fontSize36;
            private double _fontSize48;
            private double _fontSize60;
            private double _fontSize72;
            public event PropertyChangedEventHandler PropertyChanged;
            public double F18
            {
                get
                {
                    return this._fontSize18;
                }
                private set
                {
                    if (this._fontSize18 != value)
                    {
                        this._fontSize18 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F18"));
                        }
                    }
                }
            }
            public double F22
            {
                get
                {
                    return this._fontSize22;
                }
                private set
                {
                    if (this._fontSize22 != value)
                    {
                        this._fontSize22 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F22"));
                        }
                    }
                }
            }
            public double F24
            {
                get
                {
                    return this._fontSize24;
                }
                private set
                {
                    if (this._fontSize24 != value)
                    {
                        this._fontSize24 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F24"));
                        }
                    }
                }
            }
    
            public double F30
            {
                get
                {
                    return this._fontSize30;
                }
                private set
                {
                    if (this._fontSize30 != value)
                    {
                        this._fontSize30 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F30"));
                        }
                    }
                }
            }
            public double F36
            {
                get
                {
                    return this._fontSize36;
                }
                private set
                {
                    if (this._fontSize36 != value)
                    {
                        this._fontSize36 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F36"));
                        }
                    }
                }
            }
            public double F48
            {
                get
                {
                    return this._fontSize48;
                }
                private set
                {
                    if (this._fontSize48 != value)
                    {
                        this._fontSize48 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F48"));
                        }
                    }
                }
            }
            public double F60
            {
                get
                {
                    return this._fontSize60;
                }
                private set
                {
                    if (this._fontSize60 != value)
                    {
                        this._fontSize60 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F60"));
                        }
                    }
                }
            }
            public double F72
            {
                get
                {
                    return this._fontSize72;
                }
                private set
                {
                    if (this._fontSize72 != value)
                    {
                        this._fontSize72 = value;
                        if (this.PropertyChanged != null)
                        {
                            this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("F72"));
                        }
                    }
                }
            }
            public FontSizeProvider()
            {
                this.ApplyPattern();
                Configuration.Instance.PropertyChanged += new PropertyChangedEventHandler(this.Configuration_PropertyChanged);
            }
            private void Configuration_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                if (string.Compare(e.PropertyName, "FontSizePattern", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    this.ApplyPattern();
                }
            }
            ~FontSizeProvider()
            {
                Configuration.Instance.PropertyChanged -= new PropertyChangedEventHandler(this.Configuration_PropertyChanged);
            }
            private void ApplyPattern()
            {
                FontSizePattern fontSizePattern = Configuration.Instance.FontSizePattern;
                string text = string.Format("/ChinaBus;component/Themes/Fonts/{0}.xaml", fontSizePattern.ToString());
                ResourceDictionary resourceDictionary = new ResourceDictionary();
                Application.LoadComponent(resourceDictionary, new Uri(text, UriKind.Relative));
                this.F18 = (double)resourceDictionary["FontSize18"];
                this.F22 = (double)resourceDictionary["FontSize22"];
                this.F24 = (double)resourceDictionary["FontSize24"];
                this.F30 = (double)resourceDictionary["FontSize30"];
                this.F36 = (double)resourceDictionary["FontSize36"];
                this.F48 = (double)resourceDictionary["FontSize48"];
                this.F60 = (double)resourceDictionary["FontSize60"];
                this.F72 = (double)resourceDictionary["FontSize72"];
            }
    
    
        }
    
    
    
    }

    这时候你在app.xaml加入下面代码

        <utility:FontSizeProvider x:Key="FontSizeProvider"/>

    这样你就可以在xaml里面使用,代码如下

        <TextBlock Text="{Binding BusDescription}"
                                                           TextWrapping="Wrap"
                                                           Margin="0,0,50,0"  Foreground="{Binding Path=BusForeground, Source={StaticResource ThemeProvider}}" 
                                                           FontSize="{Binding Path=F18, Source={StaticResource FontSizeProvider}}" 


    当然在CS文件里面也同样可以使用,你可以用单例模式来实现..也可以每次都创建一个类来实现,代码如下

      FontSizeProvider fzp = new FontSizeProvider();
      var tbBacklineInfo = new TextBlock();
                tbBacklineInfo.TextWrapping = TextWrapping.Wrap;
                tbBacklineInfo.Text = info.BackLine;
                tbBacklineInfo.FontSize = fzp.F30;


    好了..介绍完了...有什么问题欢迎留言讨论!

  • 相关阅读:
    14.1.1 使用InnoDB 表的好处:
    7.5.1 Point-in-Time Recovery Using Event Times 使用Event Times 基于时间点恢复
    7.5 Point-in-Time (Incremental) Recovery Using the Binary Log 使用binay log 基于时间点恢复
    7.4.1 Dumping Data in SQL Format with mysqldump
    7.3.2 Using Backups for Recovery 使用备份用于恢复
    7.3.1 Establishing a Backup Policy
    RR 和RC隔离问题
    mark
    weblogic12
    转一篇对EJB理解的文章
  • 原文地址:https://www.cnblogs.com/cracker/p/windowsphone_fontsizechange.html
Copyright © 2020-2023  润新知