Windows Presentation Foundation(WPF)是微软推出的一款用于构建用户界面的框架,它为开发 Windows 桌面应用程序提供了统一的编程模型、语言和框架。WPF 将用户界面的设计与业务逻辑分离开来,采用了 XAML(可扩展应用程序标记语言)来描述界面元素,使得界面设计更加直观和灵活。与传统的 Windows Forms 相比,WPF 在图形渲染、动画效果、数据绑定等方面具有显著优势,能够创建出更加美观、交互性强的应用程序。
这段 XAML 代码定义了一个包含一个按钮的窗口,按钮位于窗口的中心位置。
上述代码创建了一个黑色边框、半径为 50 的圆形。
在后台代码中,Button_Click
事件不需要额外的逻辑,因为动画已经通过 XAML 定义好了。
在 ViewModel 中定义MyProperty
属性:
public class ViewModel : INotifyPropertyChanged
{
private string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set
{
_myProperty = value;
OnPropertyChanged(nameof(MyProperty));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这样,当MyProperty
的值在 ViewModel 中发生变化时,TextBox 中的文本会自动更新。
通过定义MyButtonStyle
样式,并将其应用到 Button 上,按钮就具有了浅蓝色背景、白色前景色和 14 号字体的样式。
要开发 WPF 应用程序,首先需要安装 Visual Studio。可以从微软官方网站下载并安装最新版本的 Visual Studio,在安装过程中,确保选择了 “.NET 桌面开发” 工作负载,其中包含了开发 WPF 应用所需的工具和框架。
创建完成后,项目中会包含以下主要文件和文件夹:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}
}
这里Button
是元素,Content
、Width
、Height
、Background
是属性。属性值可以是简单的文本、数值,也可以是更复杂的对象,如颜色对象(通过颜色名称或 RGB 值表示)。
StackPanel
是一个容器元素,它包含了两个TextBlock
元素,StackPanel
会按照垂直方向依次排列这些子元素。
默认命名空间http://schemas.microsoft.com/winfx/2006/xaml/presentation
包含了 WPF 的核心 UI 元素类型,如Window
、Button
、Grid
等。xmlns:x
引用的命名空间用于 XAML 语言本身的特性,如x:Class
用于指定代码隐藏文件中对应的类。
Binding
、StaticResource
、DynamicResource
等。例如,Binding
扩展用于数据绑定:
StaticResource
扩展用于引用资源字典中的资源:
Grid.Row
和Grid.Column
附加属性指定在网格中的位置。例如:
Orientation
属性可以设置排列方向,默认是垂直方向。例如:
DockPanel.Dock
附加属性设置停靠位置。例如:
Content
属性设置按钮显示的文本或其他内容(如图片),通过Click
事件处理按钮的点击操作。
在后台代码中:
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button clicked!");
}
Text
属性获取或设置文本内容,通过TextChanged
事件响应文本的变化。
后台代码:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;
string text = textBox.Text;
// 处理文本变化逻辑
}
ItemsSource
属性绑定数据源,通过SelectedItem
或SelectedValue
属性获取当前选中的项。
假设在 ViewModel 中定义了MyItems
集合和SelectedItem
属性:
public class ViewModel
{
public ObservableCollection MyItems { get; set; }
public string SelectedItem { get; set; }
public ViewModel()
{
MyItems = new ObservableCollection() { "Option 1", "Option 2", "Option 3" };
}
}
IsChecked
属性获取或设置复选框的选中状态,通过Checked
和Unchecked
事件响应状态变化。
在 ViewModel 中定义IsRememberMe
属性:
private bool _isRememberMe;
public bool IsRememberMe
{
get { return _isRememberMe; }
set
{
_isRememberMe = value;
OnPropertyChanged(nameof(IsRememberMe));
}
}
GroupName
属性将多个单选按钮分组,通过IsChecked
属性判断是否被选中。
这里使用了一个转换器GenderConverter
来将 ViewModel 中的Gender
属性值与单选按钮的选中状态进行转换。