《WPF程序设计指南》读书笔记——第4章 按钮与其他控件
1.Button类
using System; using System.Windows; using System.Windows.Media; using System.Windows.Input; using System.Windows.Controls; namespace LY.ClickTheButton { public class ClickTheButton:Window { [STAThread] public static void Main() { Application app = new Application(); app.Run(new ClickTheButton()); } public ClickTheButton() { Title = "Click the Butten!"; Button btn=new Button(); //下划线作用是按下Alt健时,C字母下会出现下划线 //表明Alt+C为此Button的快捷键 btn.Content = "_Click me,Please!"; //设置此按钮为焦点 btn.Focus(); //设置为默认按钮 btn.IsDefault = true; //设置为取消按钮 btn.IsCancel = true; //点击模式为悬停即触发事件 btn.ClickMode = ClickMode.Hover; //设置文字在按钮内的位置 btn.HorizontalContentAlignment = HorizontalAlignment.Left; btn.VerticalContentAlignment = VerticalAlignment.Bottom; //设置按钮在窗体中的位置 btn.HorizontalAlignment = HorizontalAlignment.Stretch; //默认为Stretch btn.VerticalAlignment = VerticalAlignment.Center; //设置外边缘大小 btn.Margin = new Thickness(48); //设置内边缘大小(即文字和边框大小) btn.Padding = new Thickness(48,48,96,96); btn.FontSize = 48; btn.FontFamily = new FontFamily("Times New Roman"); btn.Click += ButtonOnClick; Content = btn; } public void ButtonOnClick(object sender, RoutedEventArgs e) { MessageBox.Show("The button has been clicked!", Title); } } }
2.在按钮上显示文本(使用TextBlock类)
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; namespace LY.FormatTheButton { public class FormatTheButton : Window { Run runButton; [STAThread] public static void Main() { Application app = new Application(); app.Run(new FormatTheButton()); } public FormatTheButton() { Title = "Format the Button"; Button btn = new Button(); btn.HorizontalAlignment = HorizontalAlignment.Center; btn.VerticalAlignment = VerticalAlignment.Center; btn.MouseEnter += ButtonOnMouseEnter; btn.MouseLeave += ButtonOnMouseLeave; Content = btn; // 创建TextBlock对象,将其设为按钮的内容 TextBlock txtblk = new TextBlock(); txtblk.FontSize = 24; txtblk.TextAlignment = TextAlignment.Center; btn.Content = txtblk; // 在TextBlock中加入格式化文本 txtblk.Inlines.Add(new Italic(new Run("Click"))); txtblk.Inlines.Add(" the "); txtblk.Inlines.Add(runButton = new Run("button")); txtblk.Inlines.Add(new LineBreak()); txtblk.Inlines.Add("to launch the "); txtblk.Inlines.Add(new Bold(new Run("rocket"))); } void ButtonOnMouseEnter(object sender, MouseEventArgs args) { runButton.Foreground = Brushes.Red; } void ButtonOnMouseLeave(object sender, MouseEventArgs args) { runButton.Foreground = SystemColors.ControlTextBrush; } } }
1)TextBlock类在“System.Windows.Controls"命名空间里,是用于显示少量流内容的轻量控件。
2)在”System.Windows.Documents“命名空间下,Inlines是内联文本元素的集合;Run类用于显示一个无格式文本;Bold类用于显示粗体;Italic类用于显示斜体;LineBreak类用于显示换行;上述流文档可以很方便地在一个textblock中显示不同格式的文本。
3)进一步参考:http://www.cnblogs.com/jacksonyin/archive/2008/03/17/1109416.html
3.在按钮上显示图像(使用Image类)
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; namespace LY.ImageTheButton { public class ImageTheButton : Window { [STAThread] public static void Main() { Application app = new Application(); app.Run(new ImageTheButton()); } public ImageTheButton() { Title = "Image the Button"; Uri uri = new Uri("pack://application:,,/munch.png"); BitmapImage bitmap = new BitmapImage(uri); Image img = new Image(); img.Source = bitmap; img.Stretch = Stretch.None; Button btn = new Button(); btn.Content = img; btn.HorizontalAlignment = HorizontalAlignment.Center; btn.VerticalAlignment = VerticalAlignment.Center; Content = btn; } } }
1)通过”添加-现有项-添加“将图片加入工程,再通过”文件属性-生成操作-resourse"可以将图片资源内嵌到exe或dll文件中。
2)可以通过“Uri uri = new Uri("pack://application:,,/photo.png"的方式访问内嵌的资源。
4.将命令绑定给按钮(Command属性和CommandBinding类)
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; namespace LY.CommandTheButton { public class CommandTheButton : Window { [STAThread] public static void Main() { Application app = new Application(); app.Run(new CommandTheButton()); } public CommandTheButton() { Title = "Command the Button"; //将此命令绑定到事件处理器 Button btn = new Button(); btn.HorizontalAlignment = HorizontalAlignment.Center; btn.VerticalAlignment = VerticalAlignment.Center; btn.Command = ApplicationCommands.Paste; btn.Content = ApplicationCommands.Paste.Text; Content = btn; // 将命令绑定到事件处理器 CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, PasteOnExecute, PasteCanExecute)); } void PasteOnExecute(object sender, ExecutedRoutedEventArgs args) { Title = Clipboard.GetText(); } void PasteCanExecute(object sender, CanExecuteRoutedEventArgs args) { args.CanExecute = Clipboard.ContainsText(); } protected override void OnMouseDown(MouseButtonEventArgs args) { base.OnMouseDown(args); Title = "Command the Button"; } } }
1)按钮既可以通过事件触发命令,也可以通过Command属性,或CommandBindings集合将命令绑定到按钮。
2)绑定的命令可以是ApplicationCommands类、ComponentCommands类、MediaCommands类、NavigationCommands类、EditingCommands类的静态属性;前四个在System.Windows.Input命名空间,最后一个在System.Windows.Documents命名空间。
5.其他类型的常用控件(CheckBox/RadioButton/Label/TextBox/RichTextBox)
5.1 ToggleButton/CheckBox
using System; using System.Windows; using System.Windows.Input; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Media; namespace LY.ToggleTheButton { public class ToggleTheButton:Window { [STAThread] public static void Main() { Application app = new Application(); app.Run(new ToggleTheButton()); } public ToggleTheButton() { Title = "Toggle The Button"; //ToggleButton是CheckBox、RadioButton的基类 //ToggleButton btn = new ToggleButton(); CheckBox btn = new CheckBox(); btn.Content = "Can _Resize"; btn.HorizontalAlignment = HorizontalAlignment.Center; btn.VerticalAlignment = VerticalAlignment.Center; //指定IsChecked是否有三种状态True、False、Null(不确定状态) btn.IsThreeState = false; btn.IsChecked = (ResizeMode == ResizeMode.CanResize); btn.Checked += ButtonOnChecked; btn.Unchecked += ButtonOnChecked; Content = btn; } void ButtonOnChecked(object sender, RoutedEventArgs e) { ToggleButton btn = sender as ToggleButton; ResizeMode = (bool)btn.IsChecked ? ResizeMode.CanResize : ResizeMode.NoResize; } } }
5.2 数据绑定
using System; using System.Windows; using System.Windows.Input; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Media; using System.Windows.Data; namespace LY.BindTheButton { public class BindTheButton:Window { [STAThread] public static void Main() { new Application().Run(new BindTheButton()); } public BindTheButton() { Title = "Bind The Button"; ToggleButton btn = new ToggleButton(); btn.Content = "Make _Topmost"; btn.HorizontalAlignment = HorizontalAlignment.Center; btn.VerticalAlignment = VerticalAlignment.Center; //数据绑定 //btn.SetBinding(ToggleButton.IsCheckedProperty, "Topmost"); //btn.DataContext = this;b //更好的数据绑定方法 Binding bind = new Binding("Topmost"); bind.Source = this; btn.SetBinding(ToggleButton.IsCheckedProperty, bind); Content = btn; //给按钮设定一个提示项 ToolTip tip = new ToolTip(); tip.Content = "Please Click"; btn.ToolTip = tip; //Label控件 //Label lb = new Label(); //lb.Content = "File_Name"; } } }
5.3 Frame类\TextBox
using System; using System.Windows; using System.Windows.Input; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Data; namespace LY.NavigateTheWeb { public class NavigateTehWeb:Window { Frame frm; [STAThread] public static void Main() { Application app = new Application(); try { app.Run(new NavigateTehWeb()); } catch (Exception ex) { MessageBox.Show(ex.Message); } } public NavigateTehWeb() { Title = "Navigate the web"; frm = new Frame(); Content = frm; Loaded += OnWindowLoaded; } void OnWindowLoaded(object sender, RoutedEventArgs e) { UriDialog dlg = new UriDialog(); dlg.Owner = this; dlg.Text = "Http://"; dlg.ShowDialog(); //如果用Content属性,会直接显现用户输入的Uri文本 //frm.Content = new Uri(dlg.Text); //Source属性可以打开网页 frm.Source = new Uri(dlg.Text); } } }
using System; using System.Windows; using System.Windows.Input; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Data; namespace LY.NavigateTheWeb { public class UriDialog:Window { TextBox textbox; public UriDialog() { Title = "Enter a Uri"; //对话框通常不出现在任务栏 ShowInTaskbar = false; //对话框通常大小缩放到和内容一样 SizeToContent = SizeToContent.WidthAndHeight; //对话框通常设定位ToolWindow WindowStyle = WindowStyle.ToolWindow; WindowStartupLocation = WindowStartupLocation.CenterOwner; textbox = new TextBox(); textbox.Margin = new Thickness(48); //设定文本框接受回车,即允许多行编辑 textbox.AcceptsReturn = true; Content = textbox; textbox.Focus(); } public string Text { get { return textbox.Text; } set { textbox.Text = value; //设定光标起始位置 textbox.SelectionStart = textbox.Text.Length; } } protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (e.Key == Key.Enter) Close(); } } }
5.4 TextBox中文字的读取和保存
using System; using System.Windows; using System.Windows.Media; using System.Windows.Input; using System.Windows.Controls; using System.IO; namespace LY.EditSomeText { public class EditSomeText:Window { static string strFileName = Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData), "LY\\EditSomeText\\EditSomeText.txt"); TextBox txtbox; [STAThread] public static void Main() { new Application().Run(new EditSomeText()); } public EditSomeText() { Title = "Edit Some Text"; txtbox = new TextBox(); txtbox.AcceptsReturn = true; //设定换行方式 txtbox.TextWrapping = TextWrapping.Wrap; txtbox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; txtbox.KeyDown+=TxtBoxOnKeyDown; Content = txtbox; try { txtbox.Text = File.ReadAllText(strFileName); } catch { } //设定光标位置 txtbox.CaretIndex = txtbox.Text.Length; txtbox.Focus(); } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { try { Directory.CreateDirectory(Path.GetDirectoryName(strFileName)); File.WriteAllText(strFileName, txtbox.Text); } catch (Exception ex) { MessageBoxResult result = MessageBox.Show("文件不能被保持: " + ex.Message + "关闭程序?", Title, MessageBoxButton.YesNo, MessageBoxImage.Exclamation); e.Cancel = (result == MessageBoxResult.No); } } void TxtBoxOnKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.F5) { txtbox.SelectedText = DateTime.Now.ToString(); txtbox.CaretIndex = txtbox.SelectionStart + txtbox.SelectionLength; } } } }
5.5 RichTextBox中文字的读取和保存
using Microsoft.Win32; using System; using System.IO; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; namespace LY.EditSomeRichText { public class EditSomeRichText : Window { RichTextBox txtbox; string strFilter = "Document Files(*.xaml)|*.xaml|All files (*.*)|*.*"; [STAThread] public static void Main() { Application app = new Application(); app.Run(new EditSomeRichText()); } public EditSomeRichText() { Title = "Edit Some Rich Text"; txtbox = new RichTextBox(); txtbox.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; Content = txtbox; txtbox.Focus(); } protected override void OnPreviewTextInput(TextCompositionEventArgs args) { if (args.ControlText.Length > 0 && args.ControlText[0] == '\x0F') { OpenFileDialog dlg = new OpenFileDialog(); dlg.CheckFileExists = true; dlg.Filter = strFilter; if ((bool)dlg.ShowDialog(this)) { FlowDocument flow = txtbox.Document; TextRange range = new TextRange(flow.ContentStart, flow.ContentEnd); Stream strm = null; try { strm = new FileStream(dlg.FileName, FileMode.Open); range.Load(strm, DataFormats.Xaml); } catch (Exception exc) { MessageBox.Show(exc.Message, Title); } finally { if (strm != null) strm.Close(); } } args.Handled = true; } if (args.ControlText.Length > 0 && args.ControlText[0] == '\x13') { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = strFilter; if ((bool)dlg.ShowDialog(this)) {
//Document属性取得流 FlowDocument flow = txtbox.Document;
//用TextRange将流文档包围起来 TextRange range = new TextRange(flow.ContentStart, flow.ContentEnd); Stream strm = null; try { strm = new FileStream(dlg.FileName, FileMode.Create); range.Save(strm, DataFormats.Xaml); } catch (Exception exc) { MessageBox.Show(exc.Message, Title); } finally { if (strm != null) strm.Close(); } } args.Handled = true; } base.OnPreviewTextInput(args); } } }