12、控件类
控件类
控件类是指与用户有交互作用的控件,例如文本框、按钮等
背景画刷和前景画刷
可以在后端和前端设置
字体
字体常用的属性有:
FontFamily - 字体家族
FontSize - 字体大小
FontStyle - 字体样式
FontWeight - 字体粗细
鼠标光标
Cursor
例子:
(代码WpfApp6_1)
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.
例子:
(代码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)
16、文本控件
TextBox
属性:
TextWrapping(Wrap,WrapWithOverflow): 创建多行文本框
MaxLines:
MinLines:
LineCount:
VerticalScrollBarVisibility(Visible,Auto)::始终或者按需显示滚动条
Undo:撤销
SpellCheck.sEnable :拼写检查
选择文本:
属性:
SelectionStart:从0开始
SelectionLength
SelectionText
事件:
SelectionChanged:对文本选择变化加以相应
PasswordBox
用来屏蔽实际字符
例子:
(代码WpfApp6_4)
17、列表控件
ListBox控件
ListBox 类代表了一种常用的Windows设计 :允许用户从长度可变的列表中选择一项。
ListBox不仅可以包含ListBoxItem对象,也可以驻留其他任意元素。
ListBox能隐式地创建所需的ListBoxItem对象。着意味着可直接在ListBox元素中放置对象。
当在列表内部使用不同元素时需要注意一点。当读取SelectedItem、SelectedItems.Items集合时,看不到ListBoxItem对象,反而看到放入列表中的对象。
ComboBox
与ListBox类之间的重要区别是他们在窗口中呈现自身的方式。ComboBox使用下拉列表,这意味着一次只能选择一项。
例子:
(代码WpfApp6_5)
18.基于范围的控件
Slider
Slider控件:当数字本身不是特别重要时使用该控件设置数值
ProgressBar
指示长时间运行的任务进度,不能与用户交互
可作为运行状态指示器
例子:
(代码WpfApp6_6)
19、日期控件
Calendar控件
Calendar 控件显示日历,与Windows操作系统中看到的日历,该控件只显示一个月份,允许从一个月份跳到另一个月份。
DataPicker控件
DataPicker控件需要的的空间更小。模仿简单的文本框,提供了一个下拉箭头
例子:
(代码WpfApp6_7)
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()方法立即返回。
应用程序事件
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类。