列出一些控件,主要介绍与UI元素相关的功能。

WPF控件概述_控件

1.Object

Equals和GetHashCode方法

object.Equals(obj)比较两个对象是否相等,如果object是值类型,则比较所有字段(包括私有字段)如则相等则返回true,如果object是引用类型则直接比较引用ReferenceEquals(Object, Object)  。

object.GetHashCode(),当object作为字典的key时,默认的用此函数产生相关的hash值。

2.DispatcherObject

Dispatcher属性

提供了在指定(创建对象的)线程(通常是UI线程),如果要操作UI属性必须要在UI线程上,此属性提供了两种方法用于在UI线程中执行任务:BeginInvoke异步执行,Invoke同步执行。

3.DependencyObject

此类为UI控件提供了定义依赖属性的能力。

4.Visual

VisualTreeHelper Class (System.Windows.Media) | Microsoft Learn

在WPF中提供渲染支持,包括命中测试、坐标转换和边界框计算.

VisualTreeHelper

提供一些实用工具方法,用于执行涉及可视化树中的节点的常规任务。

// Enumerate all the descendants of the visual object.
static public void EnumVisual(Visual myVisual)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
    {
        // Retrieve child visual at specified index value.
        Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);

        // Do processing of the child visual object.

        // Enumerate children of the child visual object.
        EnumVisual(childVisual);
    }
}

5.UIElement

是 WPF 核心级实现的基类,专门定义的 UIElement 以下功能:

  • 可以呈现为派生自 Visual的子元素 (UIElement高级图形类)
  • 包含用于在布局系统解释时调整 (可能子元素 UIElement 的大小和位置的逻辑)
  • 可以响应用户输入 (包括通过处理事件路由或命令路由来控制输入发送到的位置)
  • 可以引发通过逻辑元素树传递路由的路由事件
  • 支持动画系统的某些方面

6.FrameworkElement 

添加以下功能:

  • 布局系统
  • 逻辑树
  • 对象声明周期事件
  • 支持数据绑定和动态资源引用
  • 样式, FrameworkElement.Style
  • 更多的动画支持, FrameworkElement.BeginStoryboard

7.Control 

为UI元素使用 ControlTemplate 来定义其外观, 默认的每个控件都有默认的ControlTemplate, 如果没有Template控件不会显示,下面这此属性如果在Template中没有引用,即使在控件上设置了也没有效果:

  • Background
  • BorderBrush
  • BorderThickness
  • FontFamily
  • FontSize
  • FontStretch
  • FontWeight
  • Foreground
  • HorizontalContentAlignment
  • VerticalContentAlignment

使用这些属性的一种常见方法是将ControlTemplate中的元素绑定到该属性,可以用TemplateBinding引用这此属性的值。

<Control Height="32" BorderThickness="10" BorderBrush="Red">
    <Control.Template>
        <ControlTemplate TargetType="Control">
            <Border 
                BorderBrush="{TemplateBinding BorderBrush}" 
                BorderThickness="{TemplateBinding BorderThickness}">
            </Border>
        </ControlTemplate>
    </Control.Template>
</Control>

8.ContentControl 

增加ContentProperty此属性可以设置任意类型的控件内容

<!--Create a Button with a string as its content.-->
<Button>This is string content of a Button</Button>

<!--Create a Button with a DateTime object as its content.-->
<Button xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <sys:DateTime>2004/3/4 13:6:55</sys:DateTime>
</Button>

<!--Create a Button with a single UIElement as its content.-->
<Button>
  <Rectangle Height="40" Width="40" Fill="Blue"/>
</Button>

<!--Create a Button with a panel that contains multiple objects 
as its content.-->
<Button>
  <StackPanel>
    <Ellipse Height="40" Width="40" Fill="Blue"/>
    <TextBlock TextAlignment="Center">Button</TextBlock>
  </StackPanel>
</Button>

为ContentControl创建样式

<Style x:Key="ContentCtrl" TargetType="{x:Type ContentControl}">
  <Setter Property="Background" Value="Red"/>
  <Setter Property="Foreground" Value="Green"/>
  <Setter Property="FontSize" Value="20"/>
  <Setter Property="FontWeight" Value="Bold"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ContentControl}">
        <Grid>
          <!--Keep the Ellipse a circle when ContentControl.Width
              is set.-->
          <Ellipse Width="{TemplateBinding Width}"
                   Height="{TemplateBinding Width}"
                   Fill="{TemplateBinding Background}"/>
            <ContentPresenter VerticalAlignment="Center"
                              HorizontalAlignment="Center"/>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

ContentPresenter表示ContentControl.Content.

ContentTemplate

为ContentControl.Content提供DataTemplate

<DataTemplate x:Key="template1">
  <TextBlock Text="{Binding}" FontSize="12" FontWeight="Bold" TextWrapping="Wrap"></TextBlock>
</DataTemplate>
...
<ContentControl Name="contCtrl" ContentTemplate="{StaticResource template1}" 
    Content="This is the content of the content control."/>

9.ItemsControl

ItemsControl.Items包含一组任意类型的控件

<!--Create a ListBox that contains a string, a Rectangle,
     a Panel, and a DateTime object. These items can be accessed
     via the Items property.-->
<ListBox xmlns:sys="clr-namespace:System;assembly=mscorlib"
         Name="simpleListBox">

  <!-- The <ListBox.Items> element is implicitly used.-->
  This is a string in a ListBox

  <sys:DateTime>2004/3/4 13:6:55</sys:DateTime>

  <Rectangle Height="40" Width="40"  Fill="Blue"/>

  <StackPanel Name="itemToSelect">
    <Ellipse Height="40" Fill="Blue"/>
    <TextBlock>Text below an Ellipse</TextBlock>
  </StackPanel>

  <TextBlock>String in a TextBlock</TextBlock>
</ListBox>

Template

<ListBox IsSynchronizedWithCurrentItem="True" 
         ItemsSource="{Binding}">
    <ListBox.Template>
        <ControlTemplate>
            <Border Background="Red">
                <ItemsPresenter />
            </Border>
        </ControlTemplate>
    </ListBox.Template>
    
</ListBox>

ItemsPresenter表示Items

ItemsPanel

<ListBox IsSynchronizedWithCurrentItem="True" 
         ItemsSource="{Binding}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

ItemTemplate

<ListBox Width="400" Margin="10"
         ItemsSource="{Binding Source={StaticResource myTodoList}}">
   <ListBox.ItemTemplate>
     <DataTemplate>
       <StackPanel>
         <TextBlock Text="{Binding Path=TaskName}" />
         <TextBlock Text="{Binding Path=Description}"/>
         <TextBlock Text="{Binding Path=Priority}"/>
       </StackPanel>
     </DataTemplate>
   </ListBox.ItemTemplate>
 </ListBox>

GroupStyle

<ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}">
    <ListBox.GroupStyle>
        <GroupStyle>
            <GroupStyle.HeaderTemplate>
               <DataTemplate>
                   <TextBlock FontSize="24" 
                              Text="{Binding Name}" />
                 </DataTemplate>
           </GroupStyle.HeaderTemplate>
       </GroupStyle>
    </ListBox.GroupStyle>
</ListBox>

GroupStyle 绑定的数据类型为 CollectionViewGroup

10.Selector

可以让用户从子元素中通过SelectedXXX选择子项。