WPF基础控件

目录

WPF基础控件

按钮控件:

Button:按钮

RepeatButton:长按按钮

RadioButton:单选按钮

数据显示控件

TextBox:输入框

RichTextBox:富文本

CheckBox:复选框

ComboBox:下拉框

DataPicker:日期选择器

PasswordBox:密码框

Slider:滑块

ProgressBar:进度条

TextBlock:只读文本控件

Lable:标签 显示文本控件

ListBox:显示可选择项的列表

DataGrid:数据表格控件

ListView:显示列表数据

Image:图片

ToggleButton:切换状态按钮控件

菜单导航控件

MenuItem:菜单

ContextMenu:上下文菜单

ToolBar:创建工具栏

TreeView:树状视图

TabControl:选项卡

Expander:折叠控件

信息提示控件

Popup:弹出式窗口

Window:窗口

PrintDialog:打印窗口

ToolTip:悬停时提示按钮

布局控件

Grid:网格

StackPanel:堆栈面板

DockPanel:停靠面板

WrapPanel:自动换行面板

Canvas:画布

UniformGrid:均匀网格

GridSplitter:网格分割器

TabPanel:选项卡面板

图形控件

Line:线

Rectangle:矩形

Ellipse:圆

Polyline:点的集合

Polygon:点的集合 封闭

Path:path图形

其他控件

ScrollViewer:滚动容器

GroupBox:分组容器

ViewBox:显示盒子

扩展:WPF继承树


WPF基础控件

控件类型

主要控件

按钮控件

Button、RepeatButton、RadioButton

数据显示控件

TextBlock、Lable、ImageItemsControlListViewListBoxDataGrid、DocumentViwer

输入控件

TextBox、RichTextBox、CheckBoxcomboBox、DataPicker、PasswordBoxSlider、ProgressBar

菜单导航控件

MenuItem、ContextMenu、ToolBar、TreeView、TabControl、Expander

信息提示控件

PopupWindow、PrintDialog、ToolTip

布局控件

GridStackPanelWrapPanelDockPanelUniformGridCanvasInkCanvasBorder

图形控件

Line、Rectangle、Ellipse、Polyline、Polygon、Path

其他控件

ScrollViewer、GroupBox、ViewBox

按钮控件:

Button:按钮
<Button Content="按钮" Width="100" Height="50" Click="Button_Click"/>

常用属性:

  • Content: 按钮显示的内容。
  • Width: 按钮的宽度。
  • Height: 按钮的高度。

常用事件:

  • Click: 当用户单击按钮时触发的事件。
RepeatButton:长按按钮
<RepeatButton Content="RepeatButton" Width="100" Height="50" 
              Click="RepeatButton_Click" Interval="500"/>

常用属性:

  • Content: RepeatButton 显示的内容。
  • Width: RepeatButton 的宽度。
  • Height: RepeatButton 的高度。
  • Interval: 重复触发事件之间的时间间隔(以毫秒为单位)。

常用事件:

  • Click: 当用户单击按钮时触发的事件。

在这个示例中,当用户点击按钮时,会触发名为 RepeatButton_Click 的事件处理程序。Interval 属性设置了事件重复触发之间的间隔时间(500 毫秒)。

注意:RepeatButton 是一个特殊的按钮,当用户按住它时,会不断触发 Click 事件,直到按钮被释放。

RadioButton:单选按钮
<StackPanel>
    <RadioButton Content="RadioButton1" GroupName="Options" Checked="RadioButton_Checked"/>
    <RadioButton Content="RadioButton2" GroupName="Options" Checked="RadioButton_Checked"/>
    <RadioButton Content="RadioButton3" GroupName="Options" Checked="RadioButton_Checked"/>
</StackPanel>
private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
    RadioButton radioButton = (RadioButton)sender;
    MessageBox.Show(radioButton.Content.ToString());
}

常用属性:

  • Content: RadioButton 显示的内容。
  • GroupName: 组名,确保同一组内的 RadioButton 互斥。
  • IsChecked: 是否选中。
  • IsEnabled: 是否启用。
  • HorizontalAlignment: 水平对齐方式。
  • VerticalAlignment: 垂直对齐方式。

常用事件:

  • Checked: 当 RadioButton 被选中时触发的事件。
  • Unchecked: 当 RadioButton 被取消选中时触发的事件。

数据显示控件

TextBox:输入框
<TextBox  Name="textBox" Width="200" Height="30" 
          TextChanged="TextBox_TextChanged" KeyDown="TextBox_KeyDown" 
          LostFocus="TextBox_LostFocus"/>

常用属性:

  • Text: 获取或设置 TextBox 中的文本内容。
  • MaxLength: 指定 TextBox 中允许输入的最大字符数。
  • IsReadOnly: 指示 TextBox 是否为只读。
  • AcceptsReturn: 指示 TextBox 是否接受回车键输入(多行文本输入)。
  • AcceptsTab: 指示 TextBox 是否接受 Tab 键输入。
  • HorizontalScrollBarVisibility: 设置水平滚动条的可见性(Disabled, Auto, Hidden, Visible)。
  • VerticalScrollBarVisibility: 设置垂直滚动条的可见性(Disabled, Auto, Hidden, Visible)。
  • TextWrapping: 指示是否自动换行(NoWrap, Wrap, WrapWithOverflow)。
  • PlaceholderText: 获取或设置在 TextBox 中未输入文本时显示的占位符文本(如果使用 WPF 早期版本可能需要自定义)。
  • CaretIndex: 获取或设置插入符号的位置。

常用事件:

  • TextChanged: 当 TextBox 中的文本内容发生变化时触发的事件。
  • KeyDown: 当按键按下时触发的事件。
  • KeyUp: 当按键释放时触发的事件。
  • LostFocus: 当 TextBox 失去焦点时触发的事件。
  • GotFocus: 当 TextBox 获得焦点时触发的事件。

TextChanged 事件处理程序

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox textBox = sender as TextBox;
    // 处理文本变化事件的代码
    MessageBox.Show("Text changed: " + textBox.Text);
}

KeyDown 事件处理程序

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        // 处理回车键按下的事件
        MessageBox.Show("Enter key pressed");
    }
}

LostFocus 事件处理程序

private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
    TextBox textBox = sender as TextBox;
    // 处理失去焦点事件的代码
    MessageBox.Show("TextBox lost focus");
}

RichTextBox:富文本
<RichTextBox Name="richTextBox" Width="300" Height="200" 
             TextChanged="RichTextBox_TextChanged" 
             SelectionChanged="RichTextBox_SelectionChanged" />

常用属性:

  • Document: 获取或设置 RichTextBox 显示的 FlowDocument。
  • IsReadOnly: 指示 RichTextBox 是否为只读。
  • CaretPosition: 获取或设置插入符号的位置。
  • Selection: 获取当前选定的内容。
  • HorizontalScrollBarVisibility: 设置水平滚动条的可见性(Disabled, Auto, Hidden, Visible)。
  • VerticalScrollBarVisibility: 设置垂直滚动条的可见性(Disabled, Auto, Hidden, Visible)。
  • AcceptsReturn: 指示是否接受回车键输入。
  • AcceptsTab: 指示是否接受 Tab 键输入。

常用事件:

  • TextChanged: 当 RichTextBox 中的文本内容发生变化时触发的事件。
  • SelectionChanged: 当 RichTextBox 中的文本选择发生变化时触发的事件。
  • GotFocus: 当 RichTextBox 获得焦点时触发的事件。
  • LostFocus: 当 RichTextBox 失去焦点时触发的事件.

TextChanged 事件处理程序

private void RichTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    RichTextBox richTextBox = sender as RichTextBox;
    // 处理文本变化事件的代码
    MessageBox.Show("Text changed in RichTextBox");
}

SelectionChanged 事件处理程序

private void RichTextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
    RichTextBox richTextBox = sender as RichTextBox;
    // 处理选择变化事件的代码
    MessageBox.Show("Selection changed in RichTextBox");
}

使用 XAML 设置初始内容

<RichTextBox Name="richTextBox" Width="300" Height="200" 
  TextChanged="RichTextBox_TextChanged" 
  SelectionChanged="RichTextBox_SelectionChanged" >
  <RichTextBox.Document>
    <FlowDocument>
      <Paragraph>
        <Run Text="测试" Foreground="Red"></Run>
        <Run Text="开发" Foreground="Blue"></Run>
      </Paragraph>
    </FlowDocument>
  </RichTextBox.Document>
</RichTextBox>

使用C#代码设置初始内容

private void initRichTextBox()
{
    Paragraph paragraph = new Paragraph();
    Run run = new Run();
    run.Text = "Hello World";
    run.Foreground = new SolidColorBrush(Colors.Orange);
    paragraph.Inlines.Add(run);
    FlowDocument flowDocument = new FlowDocument(paragraph);
    richTextBox.Document = flowDocument;
}

CheckBox:复选框
<CheckBox Name="checkBox" Content="Check me" IsChecked="False" 
          HorizontalAlignment="Center" VerticalAlignment="Center"
          Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>

常用属性:

  • Content: CheckBox 显示的内容。
  • IsChecked: 获取或设置 CheckBox 是否选中(可以是 True, False, 或 null 表示未确定状态)。
  • IsThreeState: 指示 CheckBox 是否支持三态(选中、未选中、未确定)。
  • IsEnabled: 指示 CheckBox 是否启用。
  • HorizontalAlignment: 水平对齐方式。
  • VerticalAlignment: 垂直对齐方式。

常用事件:

  • Checked: 当 CheckBox 被选中时触发的事件。
  • Unchecked: 当 CheckBox 被取消选中时触发的事件。
  • Indeterminate: 当 CheckBox 进入未确定状态时触发的事件。

Checked 事件处理程序

private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    // 处理 CheckBox 选中事件的代码
    MessageBox.Show("CheckBox is checked.");
}

Unchecked 事件处理程序

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    // 处理 CheckBox 取消选中事件的代码
    MessageBox.Show("CheckBox is unchecked.");
}

Indeterminate 事件处理程序(如果 IsThreeState 为 true)

private void CheckBox_Indeterminate(object sender, RoutedEventArgs e)
{
    // 处理 CheckBox 未确定状态事件的代码 半选中状态
    MessageBox.Show("CheckBox is indeterminate.");
}
ComboBox:下拉框
<ComboBox Name="comboBox" Width="200" Height="30" 
          SelectionChanged="ComboBox_SelectionChanged">
    <ComboBoxItem Content="Item 1"/>
    <ComboBoxItem Content="Item 2"/>
    <ComboBoxItem Content="Item 3"/>
</ComboBox>

常用属性

  • ItemsSource: 获取或设置用于填充 ComboBox 的数据源。
  • SelectedItem: 获取或设置 ComboBox 中当前选定的项。
  • SelectedIndex: 获取或设置 ComboBox 中当前选定项的索引。
  • IsEditable: 指示 ComboBox 是否可编辑。
  • Text: 获取或设置 ComboBox 中当前选定项的文本。
  • DisplayMemberPath: 获取或设置显示项的属性路径。如果是ItemsSource传值,就显示的字段名
  • SelectedValuePath: 获取或设置选定项的值路径。
  • IsDropDownOpen: 获取或设置下拉部分是否已打开。
  • MaxDropDownHeight: 获取或设置下拉部分的最大高度。

常用事件:

  • SelectionChanged: 当 ComboBox 中选定项发生变化时触发的事件。
  • DropDownOpened: 当下拉部分打开时触发的事件。
  • DropDownClosed: 当下拉部分关闭时触发的事件.

SelectionChanged 事件处理程序

private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MessageBox.Show(comboBox.SelectedIndex+"");
}

数据绑定示例

....
List<ComboxItem> itemList = new List<ComboxItem>
{
    new ComboxItem { Name = "张三", Id = "1" },
    new ComboxItem { Name = "李四", Id = "2" },
    new ComboxItem { Name = "王二", Id = "3" }
};
comboBox.ItemsSource = itemList;
.....
 class ComboxItem
 {
     public string Name { get; set; }
     public string Id { get; set; }
 }
 <ComboBox Name="comboBox" Width="200" Height="30" 
           SelectionChanged="ComboBox_SelectionChanged"
           DisplayMemberPath="Name"/>
DataPicker:日期选择器
<DatePicker Name="datePicker" Width="200" 
            SelectedDateChanged="DatePicker_SelectedDateChanged" />

常用属性:

  • SelectedDate: 获取或设置 DatePicker 中当前选定的日期。
  • DisplayDate: 获取或设置在日历中显示的日期。
  • FirstDayOfWeek: 获取或设置 DatePicker 中每周的第一天。
  • IsDropDownOpen: 获取或设置下拉部分是否已打开。
  • DisplayDateStart: 获取或设置日历中可选日期范围的开始日期。
  • DisplayDateEnd: 获取或设置日历中可选日期范围的结束日期。
  • IsTodayHighlighted: 获取或设置是否高亮显示今天的日期。
  • SelectedDateFormat: 获取或设置 DatePicker 显示日期的格式(Short 或 Long)。

常用事件:

  • SelectedDateChanged: 当 DatePicker 中选定日期发生变化时触发的事件。
  • CalendarOpened: 当日历部分打开时触发的事件。
  • CalendarClosed: 当日历部分关闭时触发的事件。

SelectedDateChanged 事件处理程序

 private void DatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
 {
     MessageBox.Show(datePicker.Text);
 }
PasswordBox:密码框
<PasswordBox Name="passwordBox" Width="200" PasswordChanged="PasswordBox_PasswordChanged"/>

常用属性:

  • Password: 获取或设置密码框中的密码字符串。
  • MaxLength: 获取或设置密码框中可以输入的最大字符数。
  • IsEnabled: 指示 PasswordBox 是否启用。
  • IsReadOnly: 指示 PasswordBox 是否为只读(通常不常用在 PasswordBox 上)。
  • HorizontalAlignment: 水平对齐方式。
  • VerticalAlignment: 垂直对齐方式。
  • PasswordChar:密码不可见样式

常用事件:

  • PasswordChanged: 当密码框中的内容发生变化时触发的事件。

PasswordChanged 事件处理程序

private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
    MessageBox.Show(passwordBox.Password);
}
Slider:滑块
<Slider Name="slider" Width="200" Height="30" 
        Minimum="0" Maximum="100" Value="50" 
        TickFrequency="10" IsSnapToTickEnabled="True" 
        ValueChanged="Slider_ValueChanged"/>

常用属性:

  • MinimumMaximum:定义了滑块的最小值和最大值,用户只能在这个范围内滑动。
  • Value:滑块当前的值,用户移动滑块时这个值会更新。
  • TickFrequency:设置滑块刻度之间的间隔,例如每隔多少单位显示一个刻度。
  • IsSnapToTickEnabled:如果设置为 True,滑块的值会自动捕捉到最近的刻度。
  • Orientation:可以设置为 Horizontal 或 Vertical,决定滑块是水平还是垂直。
  • IsMoveToPointEnabled:如果设置为 True,用户点击滑块轨道的某个位置时滑块会移动到该位置。
  • TickPlacement:决定刻度线的位置,可以设置为 None、TopLeft、BottomRight 或 Both。
  • LargeChangeSmallChange:定义了滑块在按下 Page Up/Page Down 或方向键时的移动步长。

常用事件:

  • ValueChanged: 当 Slider 的值发生变化时触发的事件。

ValueChanged 事件处理程序

private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    MessageBox.Show(slider.Value+"");
}
ProgressBar:进度条
<ProgressBar Name="progressBar" Width="200" Height="30" Minimum="0" 
             Maximum="100" Value="50" 
             ValueChanged="progressBar_ValueChanged"/>

常用属性:

  • MinimumMaximum:定义了进度条的最小值和最大值,用户只能在这个范围内设置值。
  • Value:进度条当前的值,可以程序matically 更新以显示进度。
  • IsIndeterminate:如果设置为 True,进度条进入不确定模式,表示正在进行无法预估时间的操作。来回流动
  • Orientation:可以设置为 Horizontal 或 Vertical,决定进度条的方向。
  • Foreground:设置进度条的前景色,即表示进度的颜色。
  • ValueChanged:当进度条的值发生变化时触发,可以用于实时更新 UI 或进行其他操作。

常用事件:

  • ValueChanged: 当 ProgressBar 的值发生变化时触发的事件。

ValueChanged 事件处理程序

 private void progressBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
 {
     MessageBox.Show(progressBar.Value+"");
 }
TextBlock:只读文本控件
<TextBox Width="200" Height="30" Text="Enter text here"/>

常用属性

  • Text: 设置或获取 TextBlock 中显示的文本内容。
  • Foreground: 设置或获取 TextBlock 文本的前景色。
  • Background: 设置或获取 TextBlock 文本的背景色。
  • FontSize: 设置或获取 TextBlock 文本的字体大小。
  • FontFamily: 设置或获取 TextBlock 文本的字体族。
  • FontWeight: 设置或获取 TextBlock 文本的字体粗细(例如,Normal、Bold)。
  • FontStyle: 设置或获取 TextBlock 文本的字体样式(例如,Normal、Italic)。
  • TextWrapping: 设置或获取 TextBlock 文本的换行方式(例如,NoWrap、Wrap、WrapWithOverflow)。
  • TextAlignment: 设置或获取 TextBlock 文本的对齐方式(例如,Left、Center、Right、Justify)。
  • TextDecorations: 设置或获取 TextBlock 文本的装饰(例如,下划线、删除线)。
  • Padding: 设置或获取 TextBlock 的内部间距。

常用事件

TextBlock 本身是一个显示控件,因此它没有输入事件。但是,它继承自 FrameworkElement,因此可以处理一些基本的事件,例如:

  • MouseLeftButtonDown: 处理鼠标左键按下事件。
  • MouseLeftButtonUp: 处理鼠标左键抬起事件。
  • MouseEnter: 处理鼠标进入控件事件。
  • MouseLeave: 处理鼠标离开控件事件。
Lable:标签 显示文本控件
<Label Content="Username:"/>
<TextBox Width="200" Height="30" Margin="0,5"/>
<Label Content="Password:"/>
<PasswordBox Width="200" Height="30" Margin="0,5"/>
<Button Content="Login" Width="100" Height="30" Margin="0,10"/>

常用属性

  • Content: 设置或获取 Label 中显示的文本内容。
  • Target: 设置或获取 Label 关联的目标控件,用于指示 Label 的用途。

Target用法

<Grid Margin="10">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <Label Content="_Username:" Target="{Binding ElementName=usernameTextBox}" 
      VerticalAlignment="Center"/>
    <TextBox x:Name="usernameTextBox" Grid.Column="1" Width="200" 
      Height="30" Margin="5"/>

    <Label Content="_Password:" Target="{Binding ElementName=passwordBox}" 
      Grid.Row="1" VerticalAlignment="Center"/>
    <PasswordBox x:Name="passwordBox" Grid.Column="1" Grid.Row="1" Width="200"
      Height="30" Margin="5"/>
</Grid>
  • Label 的 Content 属性包含一个下划线字符 (_) ,表示下一个字符是加速键。例如,_Username: 表示 U 是加速键。
  • Target 属性绑定到目标控件的名称(使用 {Binding ElementName=...}),当用户按下 Alt 键并激活加速键时,焦点会自动移动到目标控件。
  • x:Name 属性用于给控件命名,以便在 Binding 表达式中引用它们。
  • 按 Alt+U 会将焦点移动到用户名输入框(TextBox)。
  • 按 Alt+P 会将焦点移动到密码输入框(PasswordBox)。
ListBox:显示可选择项的列表
 <ListBox Width="200" Height="100">
      <ListBoxItem>Item 1</ListBoxItem>
      <ListBoxItem>Item 2</ListBoxItem>
      <ListBoxItem>Item 3</ListBoxItem>
</ListBox>

常用属性

  • ItemsSource: 设置或获取 ListBox 的数据源。
  • SelectedItem: 获取或设置当前选定的项目。
  • SelectedIndex: 获取或设置当前选定项目的索引。
  • SelectionMode: 设置 ListBox 的选择模式。可以是 Single(单选),Multiple(多选),或 Extended(扩展选择)。
  • ItemTemplate: 定义如何显示 ListBox 中的每个项目。

常用事件

  • SelectionChanged: 当选择的项目发生更改时触发。
 <ListBox x:Name="myListBox" Width="200" Height="100" 
            SelectionChanged="ListBox_SelectionChanged">
    <ListBoxItem Content="Item 1"/>
    <ListBoxItem Content="Item 2"/>
    <ListBoxItem Content="Item 3"/>
</ListBox>
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox listBox = sender as ListBox;
    ListBoxItem selectedItem = listBox.SelectedItem as ListBoxItem;
    if (selectedItem != null)
    {
        MessageBox.Show("Selected item: " + selectedItem.Content.ToString());
    }
}
<ListBox x:Name="myListBox" Width="200" Height="100" 
           SelectionChanged="ListBox_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" Width="100"/>
                <TextBlock Text="{Binding Age}" Width="50"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Charlie", Age = 35 }
        };

        myListBox.ItemsSource = people;
    }

    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListBox listBox = sender as ListBox;
        Person selectedPerson = listBox.SelectedItem as Person;
        if (selectedPerson != null)
        {
            MessageBox.Show("Selected person: " + selectedPerson.Name + ", Age: " 
                            + selectedPerson.Age);
        }
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
  • ItemsSource: 通过绑定数据源(例如,List<Person>)来填充 ListBox。
  • ItemTemplate: 使用 DataTemplate 定义每个项目的显示方式。
  • SelectionChanged 事件: 当用户选择项目时,显示所选项目的信息。
DataGrid:数据表格控件
 <DataGrid x:Name="dataGrid" AutoGenerateColumns="True" Margin="10"/>
……
List<Person> people = new List<Person>
        {
    new Person { Name = "Alice", Age = 30, Email = "alice@example.com" },
    new Person { Name = "Bob", Age = 25, Email = "bob@example.com" },
    new Person { Name = "Charlie", Age = 35, Email = "charlie@example.com" }
};

dataGrid.ItemsSource = people;
……
public class Person
{
   public string Name { get; set; }
   public int Age { get; set; }
   public string Email { get; set; }
}

常用属性

  • ItemsSource: 设置或获取 DataGrid 的数据源。
  • AutoGenerateColumns: 设置为 True 时,自动生成列;设置为 False 时,需要手动定义列。
  • Columns: 定义 DataGrid 中的列集合。
  • SelectionMode: 设置选择模式,单选或多选。
  • CanUserAddRows: 设置用户是否可以添加新行。
  • CanUserDeleteRows: 设置用户是否可以删除行。
  • CanUserSortColumns: 设置用户是否可以排序列。

常用事件

  • SelectionChanged: 当选择的项目发生更改时触发。
  • CellEditEnding: 当单元格编辑即将结束时触发。
  • RowEditEnding: 当行编辑即将结束时触发。
  • LoadingRow: 当行加载时触发。

自定义列

 <Grid>
    <DataGrid x:Name="dataGrid" AutoGenerateColumns="False" Margin="10" 
              SelectionChanged="DataGrid_SelectionChanged">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="*"/>
            <DataGridTextColumn Header="Age" Binding="{Binding Age}" Width="*"/>
            <DataGridTextColumn Header="Email" Binding="{Binding Email}" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
……
List<Person> people = new List<Person>
        {
    new Person { Name = "Alice", Age = 30, Email = "alice@example.com" },
    new Person { Name = "Bob", Age = 25, Email = "bob@example.com" },
    new Person { Name = "Charlie", Age = 35, Email = "charlie@example.com" }
};

dataGrid.ItemsSource = people;
……
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    DataGrid dataGrid = sender as DataGrid;
    Person selectedPerson = dataGrid.SelectedItem as Person;
    if (selectedPerson != null)
    {
        MessageBox.Show("Selected person: " + selectedPerson.Name);
    }
}
……
public class Person
{
      public string Name { get; set; }
      public int Age { get; set; }
      public string Email { get; set; }
}
  • AutoGenerateColumns: 设置为 False,这样可以自定义列。
  • DataGridTextColumn: 用于显示文本数据的列,Header 属性设置列标题,Binding 属性绑定到数据源中的相应属性。
  • SelectionChanged 事件: 当选择的项目发生更改时,显示所选项目的信息。

编辑功能

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False" Margin="10" 
                  CanUserAddRows="True" CanUserDeleteRows="True" 
                  CanUserSortColumns="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="*"/>
        <DataGridTextColumn Header="Age" Binding="{Binding Age}" Width="*"/>
        <DataGridTextColumn Header="Email" Binding="{Binding Email}" Width="*"/>
    </DataGrid.Columns>
</DataGrid>
……
List<Person> people = new List<Person>
        {
    new Person { Name = "Alice", Age = 30, Email = "alice@example.com" },
    new Person { Name = "Bob", Age = 25, Email = "bob@example.com" },
    new Person { Name = "Charlie", Age = 35, Email = "charlie@example.com" }
};

dataGrid.ItemsSource = people;
……
public class Person
{
   public string Name { get; set; }
   public int Age { get; set; }
   public string Email { get; set; }
}
ListView:显示列表数据
 <ListView x:Name="listView" Width="350" Height="250">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" 
              Width="120"/>
            <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" 
              Width="50"/>
            <GridViewColumn Header="Email" DisplayMemberBinding="{Binding Email}"
              Width="150"/>
        </GridView>
    </ListView.View>
</ListView>
List<Person> people = new List<Person>
    {
        new Person { Name = "Alice", Age = 30, Email = "alice@example.com" },
        new Person { Name = "Bob", Age = 25, Email = "bob@example.com" },
        new Person { Name = "Charlie", Age = 35, Email = "charlie@example.com" 
    }
};

listView.ItemsSource = people;

常用属性

  • ItemsSource: 设置或获取 ListView 的数据源。
  • View: 定义 ListView 的显示模式,可以是 GridView、TileView 等。
  • SelectedItem: 获取或设置当前选定的项目。
  • SelectedIndex: 获取或设置当前选定项目的索引。
  • SelectionMode: 设置选择模式,单选或多选。

常用事件

  • SelectionChanged: 当选择的项目发生更改时触发。

详细视图

<ListView x:Name="listView" Width="350" Height="250" SelectionChanged="ListView_SelectionChanged">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"
              Width="120"/>
            <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" 
              Width="50"/>
            <GridViewColumn Header="Email" DisplayMemberBinding="{Binding Email}"
              Width="150"/>
        </GridView>
    </ListView.View>
</ListView>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30, Email = "alice@example.com" },
            new Person { Name = "Bob", Age = 25, Email = "bob@example.com" },
            new Person { Name = "Charlie", Age = 35, Email = "charlie@example.com" }
        };

        listView.ItemsSource = people;
    }

    private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListView listView = sender as ListView;
        Person selectedPerson = listView.SelectedItem as Person;
        if (selectedPerson != null)
        {
            MessageBox.Show("Selected person: " + selectedPerson.Name);
        }
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}

自定义项模板

 <ListView x:Name="listView" Width="350" Height="250">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" Width="120"/>
                <TextBlock Text="{Binding Age}" Width="50"/>
                <TextBlock Text="{Binding Email}" Width="150"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30, Email = "alice@example.com" },
            new Person { Name = "Bob", Age = 25, Email = "bob@example.com" },
            new Person { Name = "Charlie", Age = 35, Email = "charlie@example.com" }
        };

        listView.ItemsSource = people;
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
}
  • View: 使用 GridView 来定义详细视图,每个 GridViewColumn 定义一列。
  • ItemTemplate: 使用 DataTemplate 定义自定义的项布局。
  • SelectionChanged 事件: 当用户选择项目时,显示所选项目的信息。
Image:图片
<Image x:Name="myImage" Source="example.jpg" Width="200" Height="150"
         ImageFailed="Image_ImageFailed" ImageOpened="Image_ImageOpened"/>

常用属性

  • Source: 设置或获取图像的源路径,可以是相对路径或绝对路径。
  • Stretch: 指定如何拉伸图像以适应控件的大小。常用值包括 None、Fill、Uniform、UniformToFill。
  • StretchDirection: 指定图像可以拉伸的方向。值可以是 UpOnly、DownOnly 或 Both。
  • Width: 设置图像的宽度。
  • Height: 设置图像的高度。
private void Image_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
    MessageBox.Show("Image loading failed: " + e.ErrorException.Message);
}

private void Image_ImageOpened(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Image successfully loaded.");
}
  • Source: 通过 BitmapImage 设置图片源,可以指定图片的路径。
  • Stretch: 设置图像的拉伸模式,使其在控件中适当显示。
  • ImageFailed 事件: 当图像加载失败时,显示错误消息。
  • ImageOpened 事件: 当图像成功加载时,显示成功消息。
ToggleButton:切换状态按钮控件
 <ToggleButton x:Name="toggleButton" Content="Toggle Me" Width="100" Height="50" 
                      IsThreeState="True" Checked="ToggleButton_Checked" 
                      Unchecked="ToggleButton_Unchecked" 
                      Indeterminate="ToggleButton_Indeterminate"/>
private void ToggleButton_Checked(object sender, RoutedEventArgs e)
{
    MessageBox.Show("ToggleButton is Checked");
}

private void ToggleButton_Unchecked(object sender, RoutedEventArgs e)
{
    MessageBox.Show("ToggleButton is Unchecked");
}

private void ToggleButton_Indeterminate(object sender, RoutedEventArgs e)
{
    MessageBox.Show("ToggleButton is Indeterminate");
}
  • IsChecked: 使用该属性来确定 ToggleButton 的当前状态。
  • IsThreeState: 设置为 True 时,ToggleButton 支持三态(选中、未选中、不确定)。
  • Checked、Unchecked、Indeterminate 事件: 处理 ToggleButton 在不同状态下的事件。

常用属性

  • IsChecked: 获取或设置 ToggleButton 的状态,true 表示选中,false 表示未选中,null 表示不确定状态。
  • Content: 设置或获取 ToggleButton 的内容,可以是文本、图像或其他控件。
  • IsThreeState: 设置或获取 ToggleButton 是否支持三态(true 表示支持三态,false 表示只支持两态)。

常用事件

  • Checked: 当 ToggleButton 被选中时触发。
  • Unchecked: 当 ToggleButton 被取消选中时触发。
  • Indeterminate: 当 ToggleButton 处于不确定状态时触发。

菜单导航控件

MenuItem:菜单
<Menu>
    <MenuItem Header="_File">
        <MenuItem Header="_New" Click="NewMenuItem_Click"/>
        <MenuItem Header="_Open" Click="OpenMenuItem_Click"/>
        <MenuItem Header="_Save" Click="SaveMenuItem_Click"/>
        <Separator/>
        <MenuItem Header="_Exit" Click="ExitMenuItem_Click"/>
    </MenuItem>
    <MenuItem Header="_Edit">
        <MenuItem Header="_Cut" Click="CutMenuItem_Click"/>
        <MenuItem Header="_Copy" Click="CopyMenuItem_Click"/>
        <MenuItem Header="_Paste" Click="PasteMenuItem_Click"/>
    </MenuItem>
</Menu>

常用属性:

  • Header: 获取或设置显示在 MenuItem 上的文本。第一个加入下划线"_",表示alt + 快捷方式打开
  • Icon: 获取或设置显示在 MenuItem 左侧的图标。
  • IsCheckable: 获取或设置 MenuItem 是否可以被选中或取消选中。
  • IsChecked: 获取或设置 MenuItem 是否被选中。
  • InputGestureText: 获取或设置显示在 MenuItem 右侧的快捷键文本。仅显示提示作用
  • Items: 获取此 MenuItem 的子菜单项集合。
  • StaysOpenOnClick: 指示点击 MenuItem 后是否保持菜单打开。
  • Separator:在菜单中增加一个隔行线

常用事件:

  • Click: 当 MenuItem 被点击时触发的事件。
  • Checked: 当 MenuItem 被选中时触发的事件(仅当 IsCheckable 为 True 时适用)。
  • Unchecked: 当 MenuItem 被取消选中时触发的事件(仅当 IsCheckable 为 True 时适用)。

事件处理程序

private void NewMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("New");
}

private void OpenMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Open");
}

private void SaveMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("New");
}

private void ExitMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Exit");
}

private void CutMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Cut");
}

private void CopyMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Copy");
}

private void PasteMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Paste");
}
ContextMenu:上下文菜单
<TextBox x:Name="textBox" Width="200" Height="30" VerticalAlignment="Top" HorizontalAlignment="Center">
    <TextBox.ContextMenu>
        <ContextMenu Opened="ContextMenu_Opened">
            <MenuItem Header="Cut" Click="CutMenuItem_Click"/>
            <MenuItem Header="Copy" Click="CopyMenuItem_Click"/>
            <MenuItem Header="Paste" Click="PasteMenuItem_Click"/>
        </ContextMenu>
    </TextBox.ContextMenu>
</TextBox>

<Button x:Name="button" Content="按钮" Width="200" Height="30" 
  VerticalAlignment="Top" HorizontalAlignment="Center">
    <Button.ContextMenu>
        <ContextMenu Closed="ContextMenu_Closed">
            <MenuItem Header="Cut" Click="CutMenuItem_Click"/>
            <MenuItem Header="Copy" Click="CopyMenuItem_Click"/>
            <MenuItem Header="Paste" Click="PasteMenuItem_Click"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

事件处理程序

private void CutMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Cut");
}

private void CopyMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Copy");
}

private void PasteMenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Paste");
}
private void ContextMenu_Opened(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Open");
}

private void ContextMenu_Closed(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Close");
}

常用属性

  • Items: 获取此 ContextMenu 的子菜单项集合。
  • IsOpen: 获取或设置 ContextMenu 是否可见。
  • PlacementTarget: 获取或设置 ContextMenu 的放置目标对象。
  • Placement: 获取或设置 ContextMenu 的放置位置。
  • HorizontalOffset: 获取或设置 ContextMenu 相对于 PlacementTarget 水平方向的偏移量。
  • VerticalOffset: 获取或设置 ContextMenu 相对于 PlacementTarget 垂直方向的偏移量.

常用事件

  • OpenedClosed 事件处理程序在 ContextMenu 打开和关闭时显示消息框。
ToolBar:创建工具栏
<DockPanel>
    <!-- ToolBarTray 用于容纳多个 ToolBar -->
    <ToolBarTray DockPanel.Dock="Top">
        <!-- 定义一个 ToolBar -->
        <ToolBar>
            <Button Content="New" Click="NewButton_Click">
                <Button.ToolTip>
                    <ToolTip Content="Create a new file"/>
                </Button.ToolTip>
            </Button>
            <Button Content="Open" Click="OpenButton_Click">
                <Button.ToolTip>
                    <ToolTip Content="Open an existing file"/>
                </Button.ToolTip>
            </Button>
            <Button Content="Save" Click="SaveButton_Click">
                <Button.ToolTip>
                    <ToolTip Content="Save the current file"/>
                </Button.ToolTip>
            </Button>
            <Separator/>
            <ToggleButton Content="Bold" Click="BoldButton_Click">
                <ToggleButton.ToolTip>
                    <ToolTip Content="Toggle bold text"/>
                </ToggleButton.ToolTip>
            </ToggleButton>
            <Separator/>
            <ComboBox Width="100" SelectionChanged="FontComboBox_SelectionChanged">
                <ComboBoxItem Content="Arial"/>
                <ComboBoxItem Content="Calibri"/>
                <ComboBoxItem Content="Times New Roman"/>
            </ComboBox>
        </ToolBar>
    </ToolBarTray>

    <!-- 主内容区域 -->
    <TextBox Name="textBox" Margin="10" VerticalScrollBarVisibility="Auto"
      AcceptsReturn="True"/>
</DockPanel>

常用属性

  • Band: 获取或设置工具栏所在的带的索引(仅用于 ToolBarTray)。
  • BandIndex: 获取或设置工具栏在带中的位置索引。
  • Orientation: 获取或设置工具栏的布局方向(水平或垂直)。
  • ToolBarOverflowPanel: 获取溢出面板,用于在工具栏空间不足时存放多余的控件。
  • 使用 Band 和 BandIndex 属性来控制 ToolBar 在 ToolBarTray 中的位置。

常用事件

  • LoadedUnloaded 事件处理程序在 ToolBar 加载和卸载时显示消息框。
private void NewButton_Click(object sender, RoutedEventArgs e)
{
    textBox.Clear();
}

private void OpenButton_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Open");
}

private void SaveButton_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Save");
}

private void BoldButton_Click(object sender, RoutedEventArgs e)
{
    textBox.FontWeight = FontWeights.Bold;
}

private void FontComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox? comboBox = sender as ComboBox;
    this.textBox.Text += $"\r\n{comboBox.SelectedItem}";
}
TreeView:树状视图
<TreeView x:Name="treeView" SelectedItemChanged="treeView_SelectedItemChanged">
    <TreeViewItem Header="Root">
        <TreeViewItem Header="C-01">
            <TreeViewItem Header="C-01-01" />
            <TreeViewItem Header="C-01-02" />
        </TreeViewItem>
        <TreeViewItem Header="C-02" />
        <TreeViewItem Header="C-03" />
    </TreeViewItem>
</TreeView>

常用属性

  • Items: 获取此 TreeViewItem 的子节点集合。
  • IsExpanded: 获取或设置是否展开该 TreeViewItem。
  • Header: 获取或设置显示在 TreeViewItem 上的文本或内容。
  • IsSelected: 获取或设置是否选择该 TreeViewItem。
  • Tag: 获取或设置与该 TreeViewItem 关联的对象。

常用事件

  • SelectedItemChanged 事件处理程序在选择的项发生变化时显示消息框,显示当前选择的节点的标题。
  • Collapsed: 当 TreeViewItem 折叠时触发的事件。
  • Expanded: 当 TreeViewItem 展开时触发的事件。

SelectedItemChanged 事件处理程序

private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    MessageBox.Show(((TreeViewItem)treeView.SelectedItem).Header as string);
}
TabControl:选项卡
<TabControl x:Name="tabControl" SelectionChanged="TabControl_SelectionChanged">
    <TabItem Header="Tab01">
        <TextBlock Text="01"/>
    </TabItem>
    <TabItem Header="Tab02">
        <TextBlock Text="02"/>
    </TabItem>
</TabControl>
<TextBlock x:Name="tb" Height="30" Width="100" />

常用属性

  • Items: 获取此 TabControl 的选项卡集合。
  • SelectedIndex: 获取或设置当前选中的选项卡的索引。
  • SelectedItem: 获取或设置当前选中的选项卡。
  • TabStripPlacement: 获取或设置选项卡的位置(顶部、底部、左侧或右侧)。
  • TabStripPlacement: 获取或设置选项卡标题的对齐方式。

常用事件

  • SelectionChanged 事件处理程序在选择的选项卡发生变化时显示消息框,显示当前选择的选项卡的标题。
  • PreviewMouseDown: 当用户点击选项卡标题时触发的事件。
  • PreviewMouseMove: 当用户移动鼠标到选项卡标题上时触发的事件。

SelectionChanged事件处理程序

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    TabItem tabItem = (tabControl.SelectedItem) as TabItem;
    tb.Text = tabItem.Header.ToString();
}
Expander:折叠控件
<Expander Header="Details" IsExpanded="True" Expanded="Expander_Expanded" 
  Collapsed="Expander_Collapsed">
    <TextBlock Text="Expander" />
</Expander>

常用属性

  • Header: 获取或设置 Expander 控件的标题。
  • IsExpanded: 获取或设置一个值,指示 Expander 控件当前是否处于展开状态。
  • Content: 获取或设置 Expander 控件的内容。

常用事件

  • Expanded 事件处理程序在 Expander 控件展开时显示消息框。
  • Collapsed 事件处理程序在 Expander 控件折叠时显示消息框。

private void Expander_Expanded(object sender, RoutedEventArgs e)
{
    MessageBox.Show("展开");
}

private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
    MessageBox.Show("关闭");
}

信息提示控件

Popup:弹出式窗口
<Button Content="按钮" Name="btn" Click="Button_Click_2"/>
<Popup x:Name="popup" PlacementTarget="{Binding ElementName=btn}" Placement="Bottom">
    <TextBlock Text="textBlock" Background="AliceBlue" />
</Popup>

常用属性

  • IsOpen: 获取或设置一个值,指示 Popup 是否处于打开状态。
  • Placement: 获取或设置 Popup 的位置相对于其放置目标的方式,可以是相对于左上角、右上角、底部等。
  • PlacementTarget: 获取或设置 Popup 的放置目标,即触发 Popup 显示的控件。
  • Child: 获取或设置 Popup 内容的根元素。

常用事件

  • Opened: 当 Popup 打开时发生的事件。
  • Closed: 当 Popup 关闭时发生的事件。
private void Button_Click_2(object sender, RoutedEventArgs e)
{
    popup.IsOpen = !popup.IsOpen;
}
Window:窗口
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <!-- 在此处添加其他 UI 元素 -->
    </Grid>
</Window>

常用属性

  • Title: 获取或设置窗口的标题。
  • HeightWidth: 获取或设置窗口的高度和宽度。
  • MinHeightMinWidth: 获取或设置窗口的最小高度和最小宽度。
  • MaxHeightMaxWidth: 获取或设置窗口的最大高度和最大宽度。
  • WindowStyle: 获取或设置窗口的样式,如无边框窗口、标准窗口等。
  • ResizeMode: 获取或设置窗口的调整大小模式,如允许调整大小、禁止调整大小等。

常用事件

  • Loaded: 当窗口加载完成时触发的事件。
  • Closing: 当窗口即将关闭时触发的事件。
  • Closed: 当窗口已经关闭时触发的事件。
PrintDialog:打印窗口
<Button Content="Print" Click="Button_Click"/>

常用属性和方法

  • PrintQueue: 获取或设置要使用的打印队列(打印机)。
  • PrintTicket: 获取或设置用于打印作业的打印选项。
  • PrintableAreaHeightPrintableAreaWidth: 获取当前打印机的可打印区域的高度和宽度。
  • ShowDialog(): 显示打印对话框,允许用户选择打印机和设置打印选项。

在这个示例中,当用户点击按钮时,将创建一个 PrintDialog 对象并显示对话框。用户可以在对话框中选择打印机、设置打印选项,并确认打印操作。一旦用户点击了对话框中的打印按钮,并且打印操作成功开始,ShowDialog() 方法将返回 true,您可以在此处执行实际的打印操作。

private void Button_Click(object sender, RoutedEventArgs e)
{
    PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog() == true)
    {
        // 在这里执行打印操作

    }
}
ToolTip:悬停时提示按钮
<Button Content="按钮" ToolTip="button!" />

解释

在这个示例中,当用户将鼠标悬停在按钮上时,将显示一个简单的提示框,其中包含文本 "button!"。

常用属性

  • Content: 获取或设置 ToolTip 的内容,可以是任何 WPF 控件或元素。
  • Placement: 获取或设置 ToolTip 的位置相对于其关联的控件的方式,可以是相对于鼠标、控件的左上角、右上角等。
  • PlacementTarget: 获取或设置 ToolTip 的放置目标,即与其关联的控件。

常用事件

  • Opened: 当 ToolTip 打开时发生的事件。
  • Closed: 当 ToolTip 关闭时发生的事件。

布局控件

Grid:网格
 <Grid>
     <Grid.RowDefinitions>
         <RowDefinition Height="Auto" />
         <RowDefinition Height="*" />
     </Grid.RowDefinitions>
     <Grid.ColumnDefinitions>
         <ColumnDefinition Width="Auto" />
         <ColumnDefinition Width="*" />
     </Grid.ColumnDefinitions>
     <Button Content="btn1" Background="Red" Grid.Row="0" Grid.Column="0" />
     <Button Content="btn2" Background="Black" Grid.Row="0" Grid.Column="1" />
     <Button Content="btn3" Background="Green" Grid.Row="1" Grid.Column="0" 
             Grid.ColumnSpan="2" />
 </Grid>

解释

在这个示例中,我们创建了一个包含三个按钮的 Grid 控件。我们通过 Grid.RowDefinitions 和 Grid.ColumnDefinitions 属性定义了两行两列的网格结构。然后,我们使用 Grid.Row 和 Grid.Column 属性将每个按钮放置在网格的指定行和列上。最后,我们使用 Grid.ColumnSpan 属性将第三个按钮跨越两列。

常用属性

  • RowDefinitions: 获取或设置 Grid 的行定义集合。
  • ColumnDefinitions: 获取或设置 Grid 的列定义集合。
  • Row: 获取或设置控件所在的行索引。
  • Column: 获取或设置控件所在的列索引。
  • RowSpan: 获取或设置控件在行上的跨度。
  • ColumnSpan: 获取或设置控件在列上的跨度。

优点

  • 灵活性:Grid 允许您在一个网格中精确地定位和调整控件的大小和位置。
  • 多行多列:您可以根据需要定义多行多列的网格结构。
  • 合并单元格:通过使用 RowSpan 和 ColumnSpan 属性,您可以合并多个单元格以创建复杂的布局。

注意:宽高中: Auto 是自适应,*是一倍,平分

StackPanel:堆栈面板
<StackPanel>
    <Button Content="btn1" Background="Red" />
    <Button Content="btn2" Background="Black" />
    <Button Content="btn3" Background="Green" />
</StackPanel>

解释

在这个示例中,我们创建了一个垂直方向的 StackPanel,并在其中放置了三个按钮。按钮按照它们在 StackPanel 中的顺序垂直排列。

常用属性

  • Orientation: 获取或设置 StackPanel 的子元素排列方向,可以是 Horizontal(水平)或 Vertical(垂直)。默认值为 Vertical。

优点

  • 简单易用:StackPanel 提供了一种简单的方式来按顺序排列子元素。
  • 灵活性:您可以根据需要选择水平或垂直方向进行排列,从而满足不同的布局要求。
DockPanel:停靠面板
 <DockPanel>
     <Button Content="Top" Background="Red" DockPanel.Dock="Top"/>
     <Button Content="Bottom" Background="Black" DockPanel.Dock="Bottom"/>
     <Button Content="Left" Background="Blue" DockPanel.Dock="Left"/>
     <Button Content="Right" Background="OrangeRed" DockPanel.Dock="Right"/>
     <Button Content="Fill" Background="Green"/>
 </DockPanel>

解释

在这个示例中,我们创建了一个 DockPanel,并在其中放置了五个按钮。每个按钮都使用了 DockPanel.Dock 属性来指定停靠位置,分别停靠在顶部、底部、左侧、右侧以及填充整个 DockPanel。

常用属性

  • LastChildFill: 获取或设置一个值,指示 DockPanel 的最后一个子元素是否填充剩余的空间。默认值为 true,表示最后一个子元素将填充剩余的空间。
  • Dock: 获取或设置一个值,指示子元素停靠在 DockPanel 的哪个边缘。可以是 Top、Bottom、Left 或 Right。

优点

  • 简单易用:DockPanel 提供了一种简单的方式来停靠子元素在面板的不同边缘。
  • 灵活性:您可以根据需要选择停靠在顶部、底部、左侧、右侧或者填充整个面板。
WrapPanel:自动换行面板
 <WrapPanel Orientation="Vertical">
     <Button Content="Button 1" Background="AliceBlue"/>
     <Button Content="Button 2" Background="Green"/>
     <Button Content="Button 3" Background="Red"/>
     <Button Content="Button 4" Background="Orange"/>
     <Button Content="Button 5" Background="Yellow"/>
     <Button Content="Button 6" Background="Blue"/>
     <Button Content="Button 7" Background="PowderBlue"/>
 </WrapPanel>

解释

在这个示例中,我们创建了一个水平方向的 WrapPanel,并在其中放置了七个按钮。当空间不足时,按钮会自动换行到下一行。

常用属性

  • Orientation: 获取或设置 WrapPanel 的子元素排列方向,可以是 Horizontal(水平)或 Vertical(垂直)。默认值为 Horizontal。

优点

  • 简单易用:WrapPanel 提供了一种简单的方式来按顺序排列子元素,并自动换行到下一行或列。
  • 自动换行:当空间不足时,子元素会自动换行到下一行或列,以适应布局。
Canvas:画布
 <Canvas>
     <Button Content="Button 1" Background="Red" Canvas.Left="50" Canvas.Top="50"/>
     <Button Content="Button 2" Background="Orange" Canvas.Left="150" Canvas.Top="100"/>
     <Button Content="Button 3" Background="Yellow" Canvas.Left="250" Canvas.Top="150"/>
 </Canvas>

解释

在这个示例中,我们创建了一个 Canvas 控件,并在其中放置了三个按钮。使用 Canvas.Left 和 Canvas.Top 属性来指定每个按钮在 Canvas 中的左上角的精确位置。

常用属性

  • Left: 获取或设置元素左边缘相对于 Canvas 左边缘的距离。
  • Top: 获取或设置元素顶边缘相对于 Canvas 顶边缘的距离。
  • Right: 获取或设置元素右边缘相对于 Canvas 右边缘的距离。
  • Bottom: 获取或设置元素底边缘相对于 Canvas 底边缘的距离。

优点

  • 灵活性:Canvas 允许您在二维平面上精确放置和定位子元素,使得布局更加灵活。
  • 绝对定位:使用 Canvas,您可以使用绝对坐标系统来定位和放置子元素。

注意: 在WPF中,如果您没有为 Canvas 控件设置固定大小或者指定 Width 和 Height 属性,它将会自动调整大小以适应其内容。

UniformGrid:均匀网格
<UniformGrid Rows="2" Columns="3">
    <Button Content="Button 1" Background="Red"/>
    <Button Content="Button 2" Background="Orange"/>
    <Button Content="Button 3" Background="Yellow"/>
    <Button Content="Button 4" Background="Green"/>
    <Button Content="Button 5" Background="AliceBlue"/>
    <Button Content="Button 6" Background="Red"/>
</UniformGrid>

解释

在这个示例中,我们创建了一个包含两行三列的 UniformGrid,并在其中放置了六个按钮。UniformGrid 会自动将按钮均匀地分布在两行三列中,使得所有的按钮具有相同的大小。

常用属性

  • Rows: 获取或设置 UniformGrid 的行数。
  • Columns: 获取或设置 UniformGrid 的列数。

优点

  • 均匀分布:UniformGrid 将子元素均匀地分布在行和列中,所有的行和列具有相同的大小。
  • 简单易用:UniformGrid 提供了一种简单的方式来创建具有均匀布局的控件集合。
GridSplitter:网格分割器
 <Grid>
     <Grid.RowDefinitions>
         <RowDefinition Height="*" />
         <RowDefinition Height="*" />
     </Grid.RowDefinitions>
     <TextBlock Text="Top Content" Grid.Row="0" HorizontalAlignment="Center"/>
     <GridSplitter Grid.Row="0" ResizeDirection="Rows" ResizeBehavior="CurrentAndNext" 
       Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
     <TextBlock Text="Bottom Centent" Grid.Row="1" HorizontalAlignment="Center"/>
 </Grid>

解释

在这个示例中,我们创建了一个 Grid 控件,其中包含两行。我们在第一行和第二行之间放置了一个 GridSplitter 控件。当用户拖动 GridSplitter 控件时,可以调整第一行和第二行之间的大小。

常用属性

  • ResizeDirection: 获取或设置 GridSplitter 控件的调整大小的方向,可以是水平或垂直方向。
  • ResizeBehavior: 获取或设置 GridSplitter 控件的调整大小行为,可以是 PreviousAndNext(默认值,调整前后两行或两列的大小)或 PreviousNextAndCurrent(同时调整前后两行或两列以及当前行或列的大小)。

注意:这两个属性必须设置,否则无效

优点

  • 灵活性:GridSplitter 允许用户通过拖动来调整相邻行和列的大小,从而实现布局的灵活性。
  • 用户交互:GridSplitter 提供了一种直观的方式,让用户可以根据需要调整界面元素的大小。
TabPanel:选项卡面板

TabPanel 不是一个单独的控件,而是一个用于 TabControl 控件的默认面板。TabControl 是 WPF 中用于显示多个选项卡的控件,而 TabPanel 则负责管理这些选项卡的布局和显示。

图形控件

Line:线
<Line X1="10" Y1="10" X2="100" Y2="100" Stroke="AliceBlue" StrokeThickness="2"/>

常用属性

  • X1: 获取或设置直线的起点的 x 坐标。
  • Y1: 获取或设置直线的起点的 y 坐标。
  • X2: 获取或设置直线的终点的 x 坐标。
  • Y2: 获取或设置直线的终点的 y 坐标。
  • Stroke: 获取或设置直线的颜色。
  • StrokeThickness: 获取或设置直线的粗细。

优点

  • 简单易用:Line 控件提供了一种简单的方式来在界面上绘制直线。
  • 灵活性:您可以根据需要设置直线的起点、终点、颜色和粗细,从而实现不同样式的直线。
Rectangle:矩形
<Rectangle Width="100" Height="50" Fill="LightBlue" Stroke="Black" StrokeThickness="2"/>

常用属性

  • Width: 获取或设置矩形的宽度。
  • Height: 获取或设置矩形的高度。
  • Fill: 获取或设置矩形的填充颜色。
  • Stroke: 获取或设置矩形的边框颜色。
  • StrokeThickness: 获取或设置矩形的边框粗细。
Ellipse:圆
<Ellipse Width="100" Height="50" Fill="LightGreen" Stroke="Black" StrokeThickness="2"/>

常用属性

  • Width: 获取或设置椭圆形的宽度。
  • Height: 获取或设置椭圆形的高度。
  • Fill: 获取或设置椭圆形的填充颜色。
  • Stroke: 获取或设置椭圆形的边框颜色。
  • StrokeThickness: 获取或设置椭圆形的边框粗细。
Polyline:点的集合
 <Polyline Points="10,10 50,50 100,20" Stroke="Black" StrokeThickness="2"/>

常用属性

  • Points: 获取或设置折线上各个顶点的坐标。
  • Stroke: 获取或设置折线的颜色。
  • StrokeThickness: 获取或设置折线的粗细
Polygon:点的集合 封闭
 <Polygon Points="10,10 50,50 100,20" Fill="LightBlue" Stroke="Black" 
   StrokeThickness="2"/>

常用属性

  • Points: 获取或设置多边形上各个顶点的坐标。
  • Fill: 获取或设置多边形的填充颜色。
  • Stroke: 获取或设置多边形的边框颜色。
  • StrokeThickness: 获取或设置多边形的边框粗细。

注意:

  • Polyline: 不是封闭的,因为最后一条线段不连接到第一条线段,因此不形成封闭的图形。
  • Polygon: 是封闭的,因为最后一条线段连接到第一条线段,形成封闭的图形。
Path:path图形
<Path Stroke="Black" StrokeThickness="2">
    <Path.Data>
        <PathGeometry>
            <PathGeometry.Figures>
                <PathFigureCollection>
                    <PathFigure StartPoint="10,10">
                        <LineSegment Point="50,50"/>
                        <LineSegment Point="100,20"/>
                        <LineSegment Point="10,10"/>
                    </PathFigure>
                </PathFigureCollection>
            </PathGeometry.Figures>
        </PathGeometry>
    </Path.Data>
</Path>

常用属性

  • Stroke: 获取或设置路径的边框颜色。
  • StrokeThickness: 获取或设置路径的边框粗细。
  • Fill: 获取或设置路径的填充颜色。
  • Data: 获取或设置描述路径形状的几何数据。

Path微语言:

<Path Stroke="Black" StrokeThickness="2" Fill="LightBlue" 
  Data="M 10,10 
        L 50,50 
        Q 100,20 150,50 
        A 50,30 45 1 1 200,100 
        C 250,50 300,150 350,100 
        Z"/>
  • M (move to): 移动到指定的坐标 (x,y)。
  • L (line to): 绘制一条从当前位置到指定坐标 (x,y) 的直线。
  • Q (quadratic Bezier curve to): 绘制一条二次贝塞尔曲线,指定控制点和终点。
  • A (arc to): 绘制一个椭圆弧,指定椭圆的半径、旋转角度、弧度和方向。
  • C (cubic Bezier curve to): 绘制一条三次贝塞尔曲线,指定两个控制点和终点。
  • Z (close path): 关闭路径,绘制一条直线回到路径的起点。

其他控件

ScrollViewer:滚动容器
<ScrollViewer HorizontalScrollBarVisibility="Visible" 
              VerticalScrollBarVisibility="Visible"
              ScrollChanged="ScrollViewer_ScrollChanged">
    <StackPanel>
        <TextBlock Text="Item 1" FontSize="16"/>
        <TextBlock Text="Item 2" FontSize="16"/>
        <TextBlock Text="Item 3" FontSize="16"/>
        <TextBlock Text="Item 4" FontSize="16"/>
        <TextBlock Text="Item 5" FontSize="16"/>
        <TextBlock Text="Item 6" FontSize="16"/>
        <TextBlock Text="Item 7" FontSize="16"/>
        <TextBlock Text="Item 8" FontSize="16"/>
        <TextBlock Text="Item 9" FontSize="16"/>
        .....
        <TextBlock Text="Item 10" FontSize="16"/>
    </StackPanel>
</ScrollViewer>

常用属性

  • HorizontalScrollBarVisibility: 获取或设置水平滚动条的可见性。可选值有 Disabled, Auto, Hidden, 和 Visible。
  • VerticalScrollBarVisibility: 获取或设置垂直滚动条的可见性。可选值有 Disabled, Auto, Hidden, 和 Visible。
  • Content: 获取或设置 ScrollViewer 的子控件。

常用事件

  • ScrollChanged: 当 ScrollViewer 的滚动位置发生变化时发生。

优点

  • ScrollViewer 控件提供了简单的滚动支持,可以轻松处理内容超出可视区域的情况。
  • 通过设置滚动条的可见性,可以根据需要自动显示或隐藏滚动条。
private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    MessageBox.Show("ScrollViewer scrolled!");
}
GroupBox:分组容器
<StackPanel>
    <GroupBox Header="User Information" Margin="10">
        <StackPanel>
            <TextBlock Text="Name:" Margin="5"/>
            <TextBox Width="200" Margin="5"/>
            <TextBlock Text="Age:" Margin="5"/>
            <TextBox Width="50" Margin="5"/>
        </StackPanel>
    </GroupBox>
    <GroupBox Header="Address" Margin="10">
        <StackPanel>
            <TextBlock Text="Street:" Margin="5"/>
            <TextBox Width="200" Margin="5"/>
            <TextBlock Text="City:" Margin="5"/>
            <TextBox Width="150" Margin="5"/>
            <TextBlock Text="Country:" Margin="5"/>
            <TextBox Width="150" Margin="5"/>
        </StackPanel>
    </GroupBox>
</StackPanel>

常用属性

  • Header: 获取或设置 GroupBox 的标题。
  • HeaderTemplate: 获取或设置一个数据模板,用于自定义 GroupBox 标题的外观。
  • Content: 获取或设置 GroupBox 内的内容。
ViewBox:显示盒子
 <Viewbox Stretch="Uniform">
     <StackPanel>
         <TextBlock Text="Hello, ViewBox!" FontSize="20"/>
         <Button Content="Click Me" Width="100" Height="30"/>
     </StackPanel>
 </Viewbox>

常用属性

  • Child: 获取或设置 ViewBox 的单个子元素。
  • Stretch: 获取或设置如何拉伸和缩放子元素以适应 ViewBox 的大小。可能的值包括:
    • Stretch="None":矩形不被拉伸。
    • Stretch="Fill":矩形被拉伸以完全填充 ViewBox,不保持宽高比。
    • Stretch="Uniform":矩形等比例缩放以适应 ViewBox,保持宽高比。
    • Stretch="UniformToFill":矩形等比例缩放以完全填充 ViewBox,保持宽高比,但可能会被剪裁。
  • StretchDirection: 获取或设置 ViewBox 如何限制内容的缩放。可能的值包括:
    • UpOnly: 只允许放大内容。
    • DownOnly: 只允许缩小内容。
    • Both: 允许放大和缩小内容。

扩展:WPF继承树

相关推荐

  1. WPF模板

    2024-06-07 03:52:01       38 阅读
  2. WPF的WebBrowser

    2024-06-07 03:52:01       49 阅读
  3. WPF的ViewBox

    2024-06-07 03:52:01       52 阅读
  4. WPF —— TextBox 详解

    2024-06-07 03:52:01       42 阅读
  5. WPF —— ComboBox详解

    2024-06-07 03:52:01       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 03:52:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 03:52:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 03:52:01       82 阅读
  4. Python语言-面向对象

    2024-06-07 03:52:01       91 阅读

热门阅读

  1. python 滑雪小游戏代码

    2024-06-07 03:52:01       26 阅读
  2. 设计模式-状态模式

    2024-06-07 03:52:01       20 阅读
  3. 图像处理知识积累

    2024-06-07 03:52:01       26 阅读
  4. 非阻塞IO

    2024-06-07 03:52:01       34 阅读
  5. tcpdump

    2024-06-07 03:52:01       30 阅读
  6. VOJ 迷阵突围 题解 次短路径 dijkstra算法

    2024-06-07 03:52:01       32 阅读
  7. Kotlin 重写与重载

    2024-06-07 03:52:01       26 阅读
  8. LiveData是如何感知Room数据变化的

    2024-06-07 03:52:01       26 阅读
  9. JVM类加载时机

    2024-06-07 03:52:01       35 阅读
  10. Dart中with的用法

    2024-06-07 03:52:01       36 阅读