列出一些控件,主要介绍与UI元素相关的功能。
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选择子项。