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入门

WPF入门(1)——DataContext

WPF入门(2)——数据绑定与INotifyPropertyChanged(INPC)

WPF入门(3)——命令

WPF入门(4)——资源

WPF入门——Converter、XAML和Style

 

使用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模板选择器

WPF之事件绑定命令

<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库

 WPF开源项目整理

DMSkin

 

资料

https://www.bilibili.com/video/BV1Jy4y1C7hU?p=2&spm_id_from=pageDriver

WPF Step By Step -基础知识介绍

posted @ 2021-04-16 21:17  ~沐风  阅读(318)  评论(0编辑  收藏  举报