12、控件类

控件类

控件类是指与用户有交互作用的控件,例如文本框、按钮等

背景画刷和前景画刷

可以在后端和前端设置

字体

字体常用的属性有:
	FontFamily - 字体家族
	FontSize - 字体大小		
	FontStyle - 字体样式
	FontWeight - 字体粗细

鼠标光标

Cursor

例子:

(代码WpfApp6_1)

WPF ControlTemplate需要添加什么引用_控件

13、内容控件

内容控件(content control)是更特殊的控件类型,他们可包含并显示一块内容。从技术角度看内控控件是可以包含单个嵌套元素的控件。
与布局控件不同的是,内容控件只能包含一个字元素,而布局容器只要愿意可以包含任意多个嵌套元素。
当然仍可以在当个元素中放置大量内容,诀窍是使用单个容器,比如StackPanel或Grid面板来封装所有内容。所有内容控件都继承自ContentControl。

Content属性

与Panel类提供的Children集合来保存嵌套的元素不同,Control类添加了Content属性,改属性只接受单一对象。

对齐内容

在容器中对齐内容用HorizontalAlignment和VerticalAlignment来对齐控件,然而一旦控件包含了内容,就需要考虑另一个组织级别。需要决定内容控件中的内容和边框对齐,这是通过使用
HorizontalContentAlignment和VerticalContentAlignment属性来实现的。

14、特殊容器 ScrollViewer

如果希望让大量内容适应有限空间,滚动是重要的特性之一。在WPF中药获取滚动支持要在ScrollViewer 控件中封装需要滚动的内容。
尽管ScrollViewer控件可以包含任何内容,但通常用来封装布局容器,如Grid.
	ScrollViewer属性:
		VerticalScrollBarVisibility 属性(Visible;Auto;Disable):如果改变窗口的尺寸以使得窗口足以容下所有内容,将会禁用滚动条,但仍会显示滚动条。如果想用其他机制进行滚动,可以使用Hidden值。如果想临时阻止ScrollViewer控件执行任何操作,只能用Disabled
		HorizontalScrollBarVisibility属性:控制水平滚动

1.通过代码控制滚动
	方法:
	LineUp()
	LineDown()
	Pageup()
	PageDown()
	ScrollToToXXXXX()
2.自定义滚动
ScrollViewer 控件能够缓慢滚动任意内容,不过,最奇特的特征是允许其包含的内容参与滚动过程。
原理:
	(1)放置能够滚动的任意元素,实现IscrollInfode接口的任意元素
	(2)设置ScrolViewer.CanContentScroll设置属性为true,告诉ScrollViewer控件其内容知道如何滚动
	(3)当和ScrollViewer交互时,ScrollViewer通过IScrollInfo接口调用元素的恰当方法,元素执行自定义滚动功能。
实现IscrollInfo接口的元素很少,其中有StackPanel.

例子:

WPF ControlTemplate需要添加什么引用_应用程序_02


(代码WpfApp6_3_1)

15、带标题的控件类

GroupBox

GroupBox 是这三个继承自HeaderedContentControl 类的控件中最简单的一个。
GroupBox仍需要布局容器(如StackPanel面板)来布置内容。GroupBox控件经常用来对数量不多的相关控件进行分组,如几个相关的按钮。

TabItem

TabItem表示TabControl控件中的一页。TabItem类添加的唯一有意义的属性是IsSelected,指示当前选项卡(tab)当前是否显示在TabControl中。
属性TabStripPlacement属性使得选项卡在侧边显示

Expander

它封装了一块内容,通过单击小箭头按钮可显示或者隐藏所包含的内容,
属性:
	IsExpanded
	ExpandDirection(Up ,Left, Right)
	Collapsed :使得其他控件与Expander同步
当展开后窗口不足以显示所有内容,这可能会带来问题。解决方法是:
	(1)设置窗口的最小尺寸
	(2)设置窗口SizeToContent属性
	(3)硬编码Expander的Height和Width属性
	(4)使用ScrollViewer控件

三种控件的实例:

(代码WpfApp6_3_2)

WPF ControlTemplate需要添加什么引用_App_03

16、文本控件

TextBox

属性:
TextWrapping(Wrap,WrapWithOverflow): 创建多行文本框
MaxLines:
MinLines:
LineCount:
VerticalScrollBarVisibility(Visible,Auto)::始终或者按需显示滚动条
Undo:撤销
SpellCheck.sEnable :拼写检查
选择文本:
	属性:
		SelectionStart:从0开始
		SelectionLength
		SelectionText
	事件:
		SelectionChanged:对文本选择变化加以相应

PasswordBox

用来屏蔽实际字符

例子:

(代码WpfApp6_4)

WPF ControlTemplate需要添加什么引用_控件_04

17、列表控件

ListBox控件

ListBox 类代表了一种常用的Windows设计 :允许用户从长度可变的列表中选择一项。
ListBox不仅可以包含ListBoxItem对象,也可以驻留其他任意元素。
ListBox能隐式地创建所需的ListBoxItem对象。着意味着可直接在ListBox元素中放置对象。
当在列表内部使用不同元素时需要注意一点。当读取SelectedItem、SelectedItems.Items集合时,看不到ListBoxItem对象,反而看到放入列表中的对象。

ComboBox

与ListBox类之间的重要区别是他们在窗口中呈现自身的方式。ComboBox使用下拉列表,这意味着一次只能选择一项。

例子:

(代码WpfApp6_5)

WPF ControlTemplate需要添加什么引用_App_05

18.基于范围的控件

Slider

Slider控件:当数字本身不是特别重要时使用该控件设置数值

ProgressBar

指示长时间运行的任务进度,不能与用户交互
可作为运行状态指示器

例子:

(代码WpfApp6_6)

WPF ControlTemplate需要添加什么引用_应用程序_06

19、日期控件

Calendar控件

Calendar 控件显示日历,与Windows操作系统中看到的日历,该控件只显示一个月份,允许从一个月份跳到另一个月份。

DataPicker控件

DataPicker控件需要的的空间更小。模仿简单的文本框,提供了一个下拉箭头

例子:

(代码WpfApp6_7)

WPF ControlTemplate需要添加什么引用_App_07

20、Application类

创建Application类

1.1)、把项目中的App.Xaml文件从项目中排除。
	1.2)、新建Startup类。
	1.3)、在类中声明静态的、无返回值的Main方法。
	1.4)、在方法中创建application对象和窗口对象。
public class Startup
{
    [STAThread] //指定应用程序的 COM 线程模式是单线程单元(STA)
    static void Main()
    {            
        //方法1:
        //创建Application对象。
        Application app = new Application();
        //实例化窗口。
        MainWindow mw = new MainWindow();
        //当向Application.Run()方法传递一个窗口时,该窗口被设置为主窗口,可通过Application.MainWindow属性在整个应用程序中访问这个窗口。然后使用Run()方法触发Application.Startup事件显示主窗口。
        app.Run(mw);

        //方法2:
        //创建Application对象。
        Application app = new Application();
        //实例化窗口。
        MainWindow mw = new MainWindow();
        //设置应用程序主窗口。
        app.MainWindow = mw;
        //弹出窗口
        mw.Show();
        //当向Application.Run()方法传递一个窗口时,该窗口被设置为主窗口,可通过Application.MainWindow属性在整个应用程序中访问这个窗口。然后使用Run()方法触发Application.Startup事件显示主窗口。
        app.Run();

        //方法3
        //创建application对象。
        Application app = new Application();
        //设置uri。
        app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
        app.Run();
    }
}

程序关闭方式

通常只要窗口尚未关闭,Application类就保持应用程序处于有效状态,如果这不是期望的行为,可调整Application.ShutdownMode属性。如果手动创建Application对象就需要在调用Run()方法之前设置ShutDownMode属性。如果使用的是App.Xaml文件,那么可在xaml文件中单独设置ShutdownMode属性。 当执行Application.Run()方法的时候会导致Application.Run()方法立即返回。

应用程序事件

WPF ControlTemplate需要添加什么引用_控件_08

21、Application类的任务

显示初始界面

WPF应用程序的速度快,但并不能在瞬间启动,第一次启动应用程序的时候,会有一些延迟,因为公共语言运行时,首先要初始化 .Net环境,然后启动应用程序,这个时候显示初始界面就有作用了。在Run方法之前执行以下代码。
//屏幕初始化的时候的背景图片。
SplashScreen splashScreen = new SplashScreen("1.png");
//显示初始屏幕。
splashScreen.Show(true);
//淡出初始界面时间(单位是秒)。
splashScreen.Close(TimeSpan.FromSeconds(1));

处理命令行参数

为了处理命令行参数 ,需要响应Application.Startup事件,命令行参数是通过StartupEentArgs.Args属性作为字符串数组提供的。

访问当前Application对象

通过Application.Current.MainWindow属性可在应用程序的任何位置获取当前应用程序实例。从而在多个窗口之间进行基本交互。假设MainWindow(主窗口)中有一个Test()方法,那么在Window1窗口中可通过以下方式进行访问:

在窗口之间进行交互

1)、删除App.xaml文件。
2)、新建一个App的类且继承自Application,在里面设置窗口启动项,在写一个Window类型的集合。
3)、在主窗口实例化子窗口时,为子窗口设置Ower属性等于主窗口。
4)、在子窗口中通过Application.Current.MainWindow属性得到主窗口对	象,并调用方法。
5)、在主窗口中循环遍历集合中的数据进行设置子窗口。
//	APP类
public class App : Application
{
    [STAThread]
    public static void Main()
    {
        //实例化类。
        App app = new App();
        app.InitializeComponent();
        app.Run();
    }
    private void InitializeComponent()
    {
        //设置主窗口启动项。
        this.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
    }
    //声明一个Window类型的集合,用于放置子窗口。
    private List<Window> listWindow = new List<Window>();

    public List<Window> ListWindow
    {
        get { return listWindow; }
        set { this.listWindow = value; }
    }
}


//MainWinow
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += MainWindow_Loaded;
    }
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        //窗口加载的时候把Winow1窗口弹出来。
        Window1 w1 = new Window1();
        //为Window1Owner属性。
        w1.Owner = this;
        //显示出来。
        w1.Show();
        //将Winow1加入到集合中。
        ((App)App.Current).ListWindow.Add(w1);
    }
    /// <summary>
    /// 此方法用于将主窗口标题设置为当前时间。
    /// </summary>
    public void SetMainWinowTime()
    {
        this.Title = DateTime.Now.ToString();
    }
    /// <summary>
    /// 此方法用于设置子窗口标题为当前时间。
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < ((App)App.Current).ListWindow.Count; i++)
        {
            //将集合中的向转换为Window1对象,然后调用SetWindowTime()方法。
            ((Window1)((App)App.Current).ListWindow[i]).SetWindowTime();
        }
    } 
}

//Window窗口
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }
    /// <summary>
    /// 此方法用于设置子窗口标题为当前时间。
    /// </summary>
    public void SetWindowTime()
    {
        this.Title = DateTime.Now.ToString();
    }

    /// <summary>
    /// 此方法用于获取主窗口,然后调用SetMainWinowTime()方法。
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Click(object sender, RoutedEventArgs e)
    {
       ((MainWindow)Application.Current.MainWindow).SetMainWinowTime();
    }
}

创建单实例应用程序封装器

实现步骤:

1)、删除App.xaml文件。
2)、引用Microsoft.VisualBasic程序集。
3)、创建SignelInstanceApplication类,让其继承自Application类,在类中重写OnStartup方法(用于实例化窗口),创建Activate()方法(用于激活当前窗口)。
4)、创建SignelApplicationManager类,此类继承自WindowsFormsApplicationBase类,此类中包含了3个重要的成员。
5)、写一个Startup类,在里面写Main方法,实例化SignelApplicationManager类。