WPF(4)常用控件
序言
常用控件
Canvas、StackPanel、WrapPanel、DockPanel和Grid是WPF中主要的5种内建面板,这些面板类都位于System.Windows.Controls命名空间下。
WPF用于布局的面板主要有6个,StackPanel(栈面板)、WrapPanel(环绕面板)、DockPanel(停靠面板)、Canvas(画布)、Grid(网格面板)和 UniformGrid(均布网格)。
1.Canvas
2.StackPanel
是基于流模式的,它没有绝对定位的概念,一批控件要么从左到右排列,要么从上而下排列
放置其中的元素,按照StackPanel的属性Orientation确定采用横排布局还是纵向布局
Orientation="Horizontal"
Orientation="Vertical"
VirtualizingStackPanel
当包含大量元素集合时,请使用 VirtualizingStackPanel虚拟化元素;
与StackPanel相同,不同之处在于它可以使内容虚拟化。
3.WrapPanel
WrapPanel默认按照从左到右的方式(主要依据FlowDirection)布局内容元素,不满一行后自动换行。
4.DockPanel
DockPanel支持让元素简单地停靠在整个面板的某一条边上
5.Grid
UniformGrid
UniformGrid 就是Grid的简化版,每个单元格的大小相同,不需要定义行列集合。每个单元格始终具有相同的大小,每个单元格只能容纳一个控件,将自动按照定义在其内部的元素个数,自动创建行列,并通常保持相同的行列数。
ScrollViewer
ViewBox
Border
UserControl
对WPF来说ContentControl和ItemsControl是最重要的两个控件。
所谓ItemsTemplate和ContentTemplate都是DataTemplate类型的属性。可以用来定义对应控件显示数据的模板。
ItemsControl
ItemsControl是一种数据展示控件,大致分为三个部分组成:Template, ItemTemplate, ItemsPanel.
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Hidden"> <ItemsControl ItemsSource="{Binding CourseList}" Name="icCourses"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <!-- VirtualizingStackPanel - 虚拟化的 StackPanel(即仅生成需要显示的 UI 元素。当绑定了大量数据,而某时仅显示其中一小部分的时候,使用此控件则可大幅提高呈现效率) Orientation - 数据的排列方式(垂直排列或水平排列,也就是说 ListBox 也可以水平排列) VirtualizationMode - 虚拟化的模式 Recycling - item 的容器会被重用,默认值 Standard - 每个 item 都有自己独立的容器 注:ListBox 默认已经使用了 VirtualizingStackPanel,但是其对于变高的 DataTemplate 来说支持得不好 --> <VirtualizingStackPanel/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplateSelector> <comm:CourseDataTemplateSelector DefaultTempalte="{StaticResource courseTemplate}" SkeletonTemplate="{StaticResource skeletonTemplate}"/> </ItemsControl.ItemTemplateSelector> </ItemsControl> </ScrollViewer>
ContentControl
DataTemplate
<i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <i:InvokeCommandAction Command="{Binding LoadedCommand}" /> </i:EventTrigger> </i:Interaction.Triggers>
ScrollViewer
Application.Current.Dispatcher.Invoke(new Action(() => { CourseList.Clear(); foreach (var item in courseAll) { CourseList.Add(item); } }));
PropertyChanged
ObservableCollection<T>
在使用集合类型的数据作为列表控件的ItemSource时一般会考虑使用ObservableCollection<T>替换List<T>,因为ObservableCollection<T>类实现了INotifyChange和INotifyPropertyChanged接口,能把集合的变化立刻通知显示到它的列表控件上,改变会立刻显示出来。
WPF入门(2)——数据绑定与INotifyPropertyChanged(INPC)
使用CallerMemberName简化InotifyPropertyChanged的实现
1. 将每个 TabItem 的 Visibility 属性设置为 Visibility.Collapsed 即可隐藏标头
<TabItem Visibility="Collapsed">
2. 设置 TabControl 控件的 SelectedIndex 属性即可在选项卡之间切换
ShutdownMode="OnExplicitShutdown"
Application.Current.Dispatcher.Invoke(new Action(() => { (o as Window).DialogResult = true; }));
DataTemplateSelector模板选择器
<i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <i:InvokeCommandAction Command="{Binding LoadedCommand}"/> </i:EventTrigger> </i:Interaction.Triggers>
图表插件LiveCharts
WPF知识点--渐变色(LinearGradientBrush、GradientStop)
ContentControl与ContentPresenter区别
一般元素做模板,需要绑定“Content属性”
<Style TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <TextBlock Text="{TemplateBinding Content}"/> </ControlTemplate> </Setter.Value> </Setter> </Style>
ContentPresenter模板,不需要
<Style TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <ContentPresenter/> </ControlTemplate> </Setter.Value> </Setter> </Style>
WPF Template,ItemsPresenter,ItemContainerStyle,ItemsPanel,contentpresenter
单值转换器
多值转换器
WPF 行为的用法(Behavior)
WPF包含数据模板和控件模板,其中控件模板又包括ControlTemplate和ItemsPanelTemplate
ControlTemplate包含两个重要的属性:
1,VisualTree,该模板的视觉树,其实我们就是使用这个属性来描述控件的外观的
2,Triggers,触发器列表,里面包含一些触发器Trigger,我们可以定制这个触发器列表来使控件对外界的刺激发生反应,比如鼠标经过时文本变成粗体等。
<Button> <Button.Template> <ControlTemplate> <!--定义视觉树--> <Grid> <Ellipse Name="faceEllipse" Width="{TemplateBinding Button.Width}" Height="{TemplateBinding Control.Height}" Fill="{TemplateBinding Button.Background}"/> <TextBlock Name="txtBlock" Margin="{TemplateBinding Button.Padding}" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{TemplateBinding Button.Content}" /> </Grid> <!--定义视觉树_end--> </ControlTemplate> </Button.Template> </Button>
UserControl还是CustomControl
UserControl,其更像WinForm中自定义控件的开发风格,在开发上更简单快速,几乎可以简单地理解为:利用设计器来将多个已有控件作为子元素来拼凑成一个UserControl并修改其外观,然后后台逻辑代码直接访问这些子元素.其最大的弊端在于:其对模板样式等支持度不好,其重复使用的范围有限.
CustomControl, 其开发出来的控件才真正具有WPF风格,其对模板样式有着很好的支持,这是因为打造CustomControl时做到了逻辑代码与外观相分离,即使换上一套完全不同的视觉树其同样能很好的工作,就像WPF内置的控件一样.
事件
RoutedEvent
UI库
资料
https://www.bilibili.com/video/BV1Jy4y1C7hU?p=2&spm_id_from=pageDriver