当前位置: 首页 > news >正文

WPF8-常用控件

目录

  • 写在前面:
  • 1. 按钮控件
    • 1.1. Button 按钮
    • 1.2. RepeatButton:长按按钮
    • 1.3. RadioButton:单选按钮
  • 2. 数据显示控件
    • 2.1. TextBlock:只读文本控件
    • 2.2. Lable:标签 显示文本控件
    • 2.3. ListBox:显示可选择项的列表
    • 2.4. DataGrid:数据表格控件
    • 2.5. ListView:显示列表数据
    • 2.6. Image:图片
    • 2.7. ToggleButton:切换状态按钮控件
  • 3. 输入控件
    • 3.1. TextBox:输入框
    • 3.2. RichTextBox:富文本
    • 3.3. CheckBox:复选框
    • 3.4. ComboBox:下拉框
    • 3.5. DataPicker:日期选择器
    • 3.6. PasswordBox:密码框
    • 3.7. Slider:滑块
    • 3.8. ProgressBar:进度条
  • 4. 菜单导航控件
    • 4.1. MenuItem:菜单
    • 4.2. ContextMenu:上下文菜单
    • 4.3. ToolBar:创建工具栏
    • 4.4. TreeView:树状视图
    • 4.5. TabControl:选项卡
    • 4.6. Expander:折叠控件
  • 5. 信息提示控件
    • 5.1. Popup:弹出式窗口
    • 5.2. Window:窗口
    • 5.3. PrintDialog:打印窗口
    • 5.4. ToolTip:悬停时提示按钮
  • 6. 布局控件
  • 7. 图形控件
    • 7.1. Line:线
    • 7.2. Rectangle:矩形
    • 7.3. Ellipse:圆
    • 7.4. Polyline:点的集合
    • 7.5. Polygon:点的集合 封闭
    • 7.6. Path:path图形
    • 7.7. Path微语言:
  • 8. 其他控件
    • 8.1. ScrollViewer:滚动容器
    • 8.2. GroupBox:分组容器
    • 8.3. ViewBox:显示盒子

控件类型主要控件
按钮控件Button、RepeatButton、RadioButton
数据显示控件TextBlock、Lable、Image、ItemsControl、ListView、ListBox、DataGrid、DocumentViwer
输入控件TextBox、RichTextBox、CheckBox、comboBox、DataPicker、PasswordBox、Slider、ProgressBar
菜单导航控件MenuItem、ContextMenu、ToolBar、TreeView、TabControl、Expander
信息提示控件Popup、Window、PrintDialog、ToolTip
布局控件Grid、StackPanel、WrapPanel、DockPanel、UniformGrid、Canvas、InkCanvas、Border
图形控件Line、Rectangle、Ellipse、Polyline、Polygon、Path
其他控件ScrollViewer、GroupBox、ViewBox

写在前面:

形而上者谓之道,形而下者谓之器。WPF的运行原理可以谓之“道”,然而,如果没有动手实践写程序这个“器”,何以载道?
本篇较全面的介绍了WPF控件的类型,任何一个WPF控件都不会脱离这几种类型,只要你能举一反三、见微知著,
那么所有控件之间的差别就只在细微之处了。
学习完本篇后你能使用布局元素将控件排列在UI上,能写出有实用意义的GUI程序。
后面的篇幅就是在这个“器”的承载之下,深入研究编写优秀WPF程序的方法了。

1. 按钮控件

1.1. Button 按钮

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

常用属性:

Content: 按钮显示的内容。

Width: 按钮的宽度。

Height: 按钮的高度。

常用事件:

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

文章配图

1.2. 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 事件,直到按钮被释放。

1.3. 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 被取消选中时触发的事件。

2. 数据显示控件

2.1. 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: 处理鼠标离开控件事件。

2.2. 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)。

2.3. 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)来填充 ListBox。

ItemTemplate: 使用 DataTemplate 定义每个项目的显示方式。

SelectionChanged 事件: 当用户选择项目时,显示所选项目的信息。

2.4. 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; }
}

2.5. 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 事件: 当用户选择项目时,显示所选项目的信息。

2.6. 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 事件: 当图像成功加载时,显示成功消息。

2.7. 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 处于不确定状态时触发。

3. 输入控件

3.1. 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");
}

3.2. 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;
}

文章配图

3.3. 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.");
}

3.4. 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"/>

3.5. 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);
}

3.6. 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);
}

3.7. Slider:滑块


<Slider Name="slider" Width="200" Height="30" Minimum="0" Maximum="100" Value="50" TickFrequency="10" IsSnapToTickEnabled="True" ValueChanged="Slider_ValueChanged"/>

常用属性:

Minimum 和 Maximum:定义了滑块的最小值和最大值,用户只能在这个范围内滑动。

Value:滑块当前的值,用户移动滑块时这个值会更新。

TickFrequency:设置滑块刻度之间的间隔,例如每隔多少单位显示一个刻度。

IsSnapToTickEnabled:如果设置为 True,滑块的值会自动捕捉到最近的刻度。

Orientation:可以设置为 Horizontal 或 Vertical,决定滑块是水平还是垂直。

IsMoveToPointEnabled:如果设置为 True,用户点击滑块轨道的某个位置时滑块会移动到该位置。

TickPlacement:决定刻度线的位置,可以设置为 None、TopLeft、BottomRight 或 Both。

LargeChange 和 SmallChange:定义了滑块在按下 Page Up/Page Down 或方向键时的移动步长。

常用事件:

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


//ValueChanged 事件处理程序private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e){MessageBox.Show(slider.Value+"");
}

3.8. ProgressBar:进度条


<ProgressBar Name="progressBar" Width="200" Height="30" Minimum="0" Maximum="100" Value="50" ValueChanged="progressBar_ValueChanged"/>

文章配图

常用属性:

Minimum 和 Maximum:定义了进度条的最小值和最大值,用户只能在这个范围内设置值。

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+"");
}

4. 菜单导航控件

4.1. 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");
}

4.2. 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 垂直方向的偏移量.

常用事件

Opened 和 Closed 事件处理程序在 ContextMenu 打开和关闭时显示消息框。

4.3. 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 中的位置。

常用事件

Loaded 和 Unloaded 事件处理程序在 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}";
}

4.4. 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);
}

4.5. 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();
}

4.6. 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("关闭");
}

5. 信息提示控件

5.1. 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;
}

5.2. 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: 获取或设置窗口的标题。

Height 和 Width: 获取或设置窗口的高度和宽度。

MinHeight 和 MinWidth: 获取或设置窗口的最小高度和最小宽度。

MaxHeight 和 MaxWidth: 获取或设置窗口的最大高度和最大宽度。

WindowStyle: 获取或设置窗口的样式,如无边框窗口、标准窗口等。

ResizeMode: 获取或设置窗口的调整大小模式,如允许调整大小、禁止调整大小等。

常用事件

Loaded: 当窗口加载完成时触发的事件。

Closing: 当窗口即将关闭时触发的事件。

Closed: 当窗口已经关闭时触发的事件。

5.3. PrintDialog:打印窗口

<Button Content="Print" Click="Button_Click"/>

常用属性和方法

PrintQueue: 获取或设置要使用的打印队列(打印机)。

PrintTicket: 获取或设置用于打印作业的打印选项。

PrintableAreaHeight 和 PrintableAreaWidth: 获取当前打印机的可打印区域的高度和宽度。

ShowDialog(): 显示打印对话框,允许用户选择打印机和设置打印选项。

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


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

5.4. ToolTip:悬停时提示按钮

<Button Content="按钮" ToolTip="button!" />

解释

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

常用属性

Content: 获取或设置 ToolTip 的内容,可以是任何 WPF 控件或元素。

Placement: 获取或设置 ToolTip 的位置相对于其关联的控件的方式,可以是相对于鼠标、控件的左上角、右上角等。

PlacementTarget: 获取或设置 ToolTip 的放置目标,即与其关联的控件。

常用事件

Opened: 当 ToolTip 打开时发生的事件。

Closed: 当 ToolTip 关闭时发生的事件。

6. 布局控件

在我的另一篇博客中有详细介绍《wpf基础布局》

7. 图形控件

7.1. 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 控件提供了一种简单的方式来在界面上绘制直线。

灵活性:您可以根据需要设置直线的起点、终点、颜色和粗细,从而实现不同样式的直线。

7.2. Rectangle:矩形

<Rectangle Width="100" Height="50" Fill="LightBlue" Stroke="Black" StrokeThickness="2"/>

文章配图

常用属性

Width: 获取或设置矩形的宽度。

Height: 获取或设置矩形的高度。

Fill: 获取或设置矩形的填充颜色。

Stroke: 获取或设置矩形的边框颜色。

StrokeThickness: 获取或设置矩形的边框粗细。

7.3. Ellipse:圆

<Ellipse Width="100" Height="50" Fill="LightGreen" Stroke="Black" StrokeThickness="2"/>

文章配图

常用属性

Width: 获取或设置椭圆形的宽度。

Height: 获取或设置椭圆形的高度。

Fill: 获取或设置椭圆形的填充颜色。

Stroke: 获取或设置椭圆形的边框颜色。

StrokeThickness: 获取或设置椭圆形的边框粗细。

7.4. Polyline:点的集合

<Polyline Points="10,10 50,50 100,20" Stroke="Black" StrokeThickness="2"/>

文章配图

常用属性

Points: 获取或设置折线上各个顶点的坐标。

Stroke: 获取或设置折线的颜色。

StrokeThickness: 获取或设置折线的粗细

7.5. Polygon:点的集合 封闭

<Polygon Points="10,10 50,50 100,20" Fill="LightBlue" Stroke="Black" StrokeThickness="2"/>

文章配图

常用属性

Points: 获取或设置多边形上各个顶点的坐标。

Fill: 获取或设置多边形的填充颜色。

Stroke: 获取或设置多边形的边框颜色。

StrokeThickness: 获取或设置多边形的边框粗细。

注意:

Polyline: 不是封闭的,因为最后一条线段不连接到第一条线段,因此不形成封闭的图形。

Polygon: 是封闭的,因为最后一条线段连接到第一条线段,形成封闭的图形。

7.6. 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: 获取或设置描述路径形状的几何数据。

7.7. 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): 关闭路径,绘制一条直线回到路径的起点。

8. 其他控件

8.1. 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!");
}

8.2. 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 内的内容。

8.3. 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: 允许放大和缩小内容。

相关文章:

WPF8-常用控件

目录 写在前面&#xff1a;1. 按钮控件1.1. Button 按钮1.2. RepeatButton:长按按钮1.3. RadioButton:单选按钮 2. 数据显示控件2.1. TextBlock&#xff1a;只读文本控件2.2. Lable&#xff1a;标签 显示文本控件2.3. ListBox&#xff1a;显示可选择项的列表2.4. DataGrid&…...

电商小程序(源码+文档+部署+讲解)

引言 随着移动互联网的快速发展&#xff0c;电商小程序成为连接消费者与商家的重要桥梁。电商小程序通过数字化手段&#xff0c;为消费者提供了一个便捷、高效的购物平台&#xff0c;从而提升购物体验和满意度。 系统概述 电商小程序采用前后端分离的架构设计&#xff0c;服…...

关于C#的一些基础知识点汇总

1.C#结构体可以继承接口吗&#xff1f;会不会产生GC&#xff1f; 在 C# 中&#xff0c;结构体不能继承类&#xff0c;但可以实现接口。 代码&#xff1a; interface IMyInterface {void MyMethod(); }struct MyStruct : IMyInterface {public void MyMethod(){Console.Write…...

七、敏捷开发工具:持续集成与部署工具

一、敏捷开发工具——持续集成与部署工具 持续集成(CI)与持续部署(CD)是现代敏捷开发中不可或缺的关键实践。通过自动化构建、测试和部署流程,团队可以快速反馈、提高代码质量,并加速产品交付。为此,持续集成与部署工具应运而生,它们能够帮助开发团队在整个开发周期内…...

【工具类】 Hutool 中用于生成随机数的工具类

博主介绍&#xff1a;✌全网粉丝22W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

vue3和vue2的组件开发有什么区别

Vue3和Vue2在组件开发上存在不少差异&#xff0c;下面从多个方面详细介绍&#xff1a; 响应式原理 Vue2&#xff1a;用Object.defineProperty()方法来实现响应式。打个比方&#xff0c;它就像给对象的每个属性都安排了一个“小管家”&#xff0c;属性被访问或修改时&#xff0…...

防御保护选路练习

拓扑 配置 IP的基本配置 r2 [R2]int g0/0/0 [R2-GigabitEthernet0/0/0]ip add 12.0.0.2 255.255.255.0 [R2]int g0/0/2 [R2-GigabitEthernet0/0/2]ip add 210.1.1.254 255.255.255.0 [R2-GigabitEthernet0/0/2]int g0/0/1 [R2-GigabitEthernet0/0/1]ip add 200.1.1.254 255.…...

SQL Server 运算符优先级

在 SQL Server 中&#xff0c;运算符的优先级决定了在没有使用括号明确指定计算顺序时&#xff0c;运算符的执行顺序。 运算符优先级列表 括号 () 一元运算符 &#xff08;正号&#xff09;-&#xff08;负号&#xff09;~&#xff08;按位取反&#xff09; 乘法、除法和取模…...

【RK3588嵌入式图形编程】-SDL2-构建模块化UI

构建模块化UI 文章目录 构建模块化UI1、概述2、创建UI管理器3、嵌套组件4、继承5、多态子组件6、总结在本文中,将介绍如何使用C++和SDL创建一个灵活且可扩展的UI系统,重点关注组件层次结构和多态性。 1、概述 在前面的文章中,我们介绍了应用程序循环和事件循环,这为我们的…...

用STC-ISP写延时函数

若想写出自己可以定义时长的延时函数&#xff0c;需要重新生成一个1ms的延时函数并稍加修改。 STC-ISP生成的1ms的延时函数代码如下&#xff1a; void Delay1ms(void) //12.000MHz {unsigned char data i, j;i 2;j 239;do{while (--j);} while (--i); }将上述代码改为可自定…...

DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地

对于个人开发者或尝鲜者而言&#xff0c;本地想要部署 DeepSeek 有很多种方案&#xff0c;但是一旦涉及到企业级部署&#xff0c;则步骤将会繁琐很多。 比如我们的第一步就需要先根据实际业务场景评估出我们到底需要部署什么规格的模型&#xff0c;以及我们所要部署的模型&…...

使用 Docker 部署 Apache Spark 集群教程

简介 Apache Spark 是一个强大的统一分析引擎&#xff0c;用于大规模数据处理。本文将详细介绍如何使用 Docker 和 Docker Compose 快速部署一个包含一个 Master 节点和两个 Worker 节点的 Spark 集群。这种方法不仅简化了集群的搭建过程&#xff0c;还提供了资源隔离、易于扩…...

基于暗通道先验的图像去雾算法解析与实现

一、算法背景 何凯明团队于2009年提出的暗通道先验去雾算法《single image haze removal using dark channel prior》&#xff0c;通过统计发现&#xff1a;在无雾图像的局部区域中&#xff0c;至少存在一个颜色通道的像素值趋近于零。这一发现为图像去雾提供了重要的理论依据…...

深入内存调试:Valgrind工具的终极指南(转)

在软件开发的世界里&#xff0c;代码质量就是生命线&#xff0c;而内存管理又是这条生命线中最脆弱的一环。内存泄漏&#xff0c;哪怕只是微小的一处&#xff0c;日积月累&#xff0c;都可能对整个系统造成灾难性的打击&#xff0c;无论是大型企业级应用、实时性要求极高的嵌入…...

深入解析MediaPipe:强大的实时计算机视觉框架

深入解析MediaPipe&#xff1a;强大的实时计算机视觉框架 1. 引言 在计算机视觉应用的快速发展中&#xff0c;实时处理和低延迟成为了许多应用的关键需求。Google 开发的 MediaPipe 是一个强大的开源框架&#xff0c;它能够高效处理 手势识别、姿态估计、物体检测、语音处理 …...

DeepSeek 和 ChatGPT 在特定任务中的表现:逻辑推理与创意生成

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…...

大白话实战Sentinel

Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…...

【AI面板识别】

题目描述 AI识别到面板上有N&#xff08;1 ≤ N ≤ 100&#xff09;个指示灯&#xff0c;灯大小一样&#xff0c;任意两个之间无重叠。 由于AI识别误差&#xff0c;每次别到的指示灯位置可能有差异&#xff0c;以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1&#x…...

Docker安装Kafka(不依赖ZooKeeper)

创建docker-compose.yaml version: "3.9" #版本号 services:kafka:image: apache/kafka:3.9.0container_name: kafkahostname: kafkaports:- 9092:9092 # 容器内部之间使用的监听端口- 9094:9094 # 容器外部访问监听端口environment:KAFKA_NODE_ID: 1KAFKA_PROCES…...

大道至简 少字全意 易经的方式看 jvm基础 、 内存模型 、 gc、 内存异常、内存调优实战案例 、类加载机制、双亲委派模型 适用于 懂而久未用回忆 ,不懂而需明正理而用

目录 介绍 内存模型 一、线程私有区域 二、线程共享区域 1.堆Heap 2. 方法区Method Area 3.运行时常量池 Runtime constant Pool 三、直接内存(Direct Memory) 四、内存异常与调优 五、总结对比 类加载机制 一、类加载的三大阶段 二、双亲委派模型 三、类加载的特…...

【Java学习】继承

一、继承 子类继承父类&#xff0c;子类这个类变量的引用在原有的指向子类自己类变量空间的原有访问权限上&#xff0c;增加上了父类类变量空间的访问权限&#xff0c;此时子类类变量指向的空间变为了原来子类类变量空间加上父类类变量空间&#xff0c;此时子类类变量空间就变成…...

Ubuntu24安装MongoDB(解压版)

目录 0.需求说明1.环境检查2.下载软件2.1.下载MongoDB服务端2.2.下载MongoDB连接工具(可略过)2.3.检查上传或下载的安装包 3.安装MongoDB3.1.编辑系统服务3.2.启动服务3.3.客户端连接验证3.3.1.创建管理员用户 4.远程访问4.1.开启远程访问4.2.开放防火墙 0.需求说明 问&#x…...

计算机毕业设计Python考研院校推荐系统 考研分数线预测 考研推荐系统 考研可视化(代码+LW文档+PPT+讲解视频)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Python 爬虫框架对比与推荐

Python 爬虫框架对比与推荐 Python 爬虫框架对比与推荐1. Scrapy1.1 框架介绍1.2 优点1.3 缺点1.4 适用场景 2. PySpider2.1 框架介绍2.2 优点2.3 缺点2.4 适用场景 3. Selenium3.1 框架介绍3.2 优点3.3 缺点3.4 适用场景 4. BeautifulSoup Requests&#xff08;自定义方案&am…...

本地DeepSeek模型GGUF文件转换为PyTorch格式

接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…...

自动化测试框架搭建-单次接口执行-三部曲

目的 判断接口返回值和提前设置的预期是否一致&#xff0c;从而判断本次测试是否通过 代码步骤设计 第一步&#xff1a;前端调用后端已经写好的POST接口&#xff0c;并传递参数 第二步&#xff1a;后端接收到参数&#xff0c;组装并请求指定接口&#xff0c;保存返回 第三…...

SAP F1搜索帮助 添加自定义功能按钮

最近deepseek 比较火&#xff0c;好多伙伴把deep seek 调用集成到SAP 系统&#xff0c;集成需要方便的去查询问题&#xff0c;方便一点就是添加在F1搜索帮助的地方&#xff0c;看到有朋友问看自定义按钮怎么添加在F1的工具栏&#xff0c;跟踪了下代码&#xff0c;尝试了下&…...

Webpack,Vite打包的理解

Webpack 和 Vite 都是现代前端开发中常用的构建工具&#xff0c;用于打包和优化项目代码。尽管它们的目标相似&#xff0c;但在设计理念、工作方式和适用场景上存在显著差异。 Webpack Webpack 是一个模块打包工具&#xff0c;主要用于将多个模块&#xff08;如 JavaScript、…...

ollama部署大模型,本地调用

Ollama是一个强大的大型语言模型平台&#xff0c;它允许用户轻松地下载、安装和运行各种大型语言模型。在本文中&#xff0c;我将指导你如何在你的本地机器上部署Ollama&#xff0c;并展示如何使用Python进行简单的API调用以访问这些模型。 最近很多人在学习大模型的时候&…...

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑩】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase10 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月18日 关键词&#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-010测试用例 用例ID测试场景验证要点参考条款预期结果TC…...

opencv实时二维码识别的一种实现与思路分享

在嵌入式平台上比如 rk3568 这种弱鸡的平台,要做到实时视频处理就非常鸡肋,不像英伟达那种 deepstrem 什么的。 开始的时候,我们使用python 下的 pyzbar + opencv opencv 读取摄像头的数据然后每帧送到 pyzbar 二维码识别函数里面进行处理,然后打印出识别的数字。结果,非常…...

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑫】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase12 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月18日 关键词&#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-012测试用例 用例ID测试场景验证要点参考条款预期结果TC…...

Jenkins同一个项目不同分支指定不同JAVA环境

背景 一些系统应用,会为了适配不同的平台,导致不同的分支下用的是不同的gradle,导致需要不同的JAVA环境来编译,比如a分支需要使用JAVA11, b分支使用JAVA17。 但是jenkins上,一般都是Global Tool Configuration 全局所有环境公用一个JAVA_HOME。 尝试过用 Build 的Execut…...

小爱音箱连接电脑外放之后,浏览器网页视频暂停播放后,音箱整体没声音问题解决

背景 22年买的小爱音箱增强版play&#xff0c;小爱音箱连接电脑外放之后&#xff0c;浏览器网页视频暂停播放后&#xff0c;音箱整体没声音&#xff08;一边打着游戏&#xff0c;一边听歌&#xff0c;一边放视频&#xff0c;视频一暂停&#xff0c;什么声音都没了&#xff0c;…...

AIGC(生成式AI)试用 21 -- Python调用deepseek API

1. 安装openai pip3 install openai########################## Collecting openaiUsing cached openai-1.61.1-py3-none-any.whl.metadata (27 kB) Collecting anyio<5,>3.5.0 (from openai)Using cached anyio-4.8.0-py3-none-any.whl.metadata (4.6 kB) Collecting d…...

使用linux脚本部署discuz博客(详细注释版)

使用脚本部署一个discuzz项目 1.显示当前环境状态 防火墙状态 selinux状态 httpd状态 由上可知&#xff0c;虚拟机已处于最初始状态 2.脚本编写 #!/bin/bash #这是一个通过脚本来部署discuzz博客 firewalld关闭 systemctl stop firewalld if [ $? -eq 0 ];then echo "…...

Kafka的生产者和消费者模型

Kafka的生产者和消费者模型是一种消息传递模式&#xff0c;以下是该模型的详细描述&#xff1a; 一、生产者&#xff08;Producer&#xff09; 定义&#xff1a;生产者是消息的生产者&#xff0c;它将消息发布到Kafka的主题&#xff08;Topic&#xff09;中。 功能&#xff1…...

调用openssl实现加解密算法

由于工作中涉及到加解密&#xff0c;包括Hash&#xff08;SHA256&#xff09;算法、HMAC_SHA256 算法、ECDH算法、ECC签名算法、AES/CBC 128算法一共涉及5类算法&#xff0c;笔者通过查询发现openssl库以上算法都支持&#xff0c;索性借助openssl库实现上述5类算法。笔者用的op…...

【Python项目】信息安全领域中语义搜索引擎系统

【Python项目】信息安全领域中语义搜索引擎系统 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;系统主要是围绕着语义搜索展开的&#xff0c;要将输入的文字在爬取数据时能够通过深层次的内涵理解&#xff0c;来更好的查找到与之相关的精准信息…...

快速排序_912. 排序数组(10中排序算法)

快速排序_912. 排序数组&#xff08;10中排序算法&#xff09; 1 快速排序&#xff08;重点&#xff09;报错代码超时代码修改官方题解快速排序 1&#xff1a;基本快速排序快速排序 2&#xff1a;双指针&#xff08;指针对撞&#xff09;快速排序快速排序 3&#xff1a;三指针快…...

BS5852英国家具防火安全条款主要包括哪几个方面呢?

什么是BS5852检测&#xff1f; BS5852是英国针对家用家具的强制性安全要求&#xff0c;主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试&#xff0c;但实际应用中主要测试第一部分和第二部分&#xff0c;包括烟头测试和利用乙炔火焰模拟…...

高考或者单招考试需要考物理这科目

问题&#xff1a;帮忙搜索一下以上学校哪些高考或者单招考试需要考物理这科目的 回答&#xff1a; 根据目前获取的资料&#xff0c;明确提及高考或单招考试需考物理的学校为湖南工业职业技术学院&#xff0c;在部分专业单招时要求选考物理&#xff1b;其他学校暂未发现明确提…...

基于vue3实现的课堂点名程序

设计思路 采用vue3实现的课堂点名程序&#xff0c;模拟课堂座位布局&#xff0c;点击开始点名按钮后&#xff0c;一朵鲜花在座位间传递&#xff0c;直到点击结束点名按钮&#xff0c;鲜花停留的座位被点名。 课堂点名 座位组件 seat.vue <script setup>//组合式APIimpo…...

压力传感器

压力传感器是一种用于测量气体或液体压力的设备&#xff0c;广泛应用于工业控制、汽车电子、医疗设备、航空航天等领域。以下是关于压力传感器的详细介绍&#xff1a; 一、压力传感器的分类 1. 按测量原理分类 - 压阻式压力传感器&#xff1a; - 原理&#xff1a;利用压…...

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类&#xff0c;用于构建 API 视图。这些视图类可以分为以下几类&#xff1a; 1. 基础视图类 这些是 DRF 中最基础的视图类&#xff0c;通常用于实现自定义逻辑。 常用类 APIView&#xff1a; 最基本的视图类&#xff0c;所有其…...

DeepSeek介绍[Cache-Through、Cache-Around、Cache-Behind、Cache-Asid]

Cache-Through、Cache-Around、Cache-Behind和Cache-Aside是几种常见的缓存策略&#xff0c;每种策略有其独特的工作机制和应用场景。以下是对这些缓存模式的详细介绍&#xff1a; 1. Cache-Through 工作原理&#xff1a; 读操作&#xff1a;应用程序首先向缓存层请求数据。…...

React 前端框架介绍

什么是 React&#xff1f; React 是一个由 Facebook 开发并维护的开源 JavaScript 库&#xff0c;用于构建用户界面。它主要用于创建交互式用户界Face&#xff08;UI&#xff09;&#xff0c;尤其是当数据变化时需要更新部分视图时非常有效。React 的核心思想是组件化和声明性…...

自制简单的图片查看器(python)

图片格式&#xff1a;支持常见的图片格式&#xff08;JPG、PNG、BMP、GIF&#xff09;。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...

基于Electron+Vue3创建桌面应用

Electron 是一个开源框架,基于 Chromium 和 Node.js,用于开发跨平台桌面应用程序。它允许开发者使用 HTML、CSS 和 JavaScript 等 Web 技术构建原生桌面应用,支持 Windows、macOS 和 Linux。Electron 以其开发便捷性、强大的功能和丰富的生态系统而广泛应用于工具类应用、媒…...

Redis实战-扩展Redis

扩展Redis 1、扩展读性能2、扩展写性能和内存容量3、扩展复杂的查询3.1 扩展联合查询3.2 扩展分片排序 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎批评指正&#xff5e; 本篇文章大部分是来自学习《Redis实战》的笔记 1、扩展读性能 单台Redis服务器…...