Content模型表示当前元素可以直接使用其他元素作为其子元素创建需要的用户的界面。这种套嵌关系中并没有恒定的包含关系,更没有Content模型的最主要特征是Content属性这一说法。
ContentControl类,首先包含一个Content属性,用以记录该控件需要显示的信息。该属性的类型为Object,即属于该类模型的各个空进可以也只可以有一个子元素。与Content属性相关的属性,是HasContent属性,C#模拟代码如下:
public bool HasContent
{
get{ return Content==null?false:true;}
}
而XAML无法表达Content==null对应的逻辑,因为在需要以Content属性是否被设置为判读条件的请控制,该属性十分有用,并不冗余。
ContentPresenter是Content控件用以显示其Content属性记录心得外观界面元素,可以对所有派生自Object类的实例进行显示。ContentPresenter的显示有一下几个属性辅助完成:Content、ContentSource、ContentTemplate、ContentTemplateSelector:
- 若Content属性属于UIElement类的派生类,则直接将他加到视觉树;
- 若ContentTemplate属性被设置,那么根据ContentTemplate记录的模板创建一个用来显示Content的界面元素实例并将它添加到视觉树;
- 若ContentTemplateSelector属性被设置,那么根据其记录的模板选择一个适当的模板,并根据此模板按照2创建Content属性的视觉树;
- 若Content属性记录的数据类型具有一个数据模板(DateTemplate),那么使用它作为Content属性创建界面元素;
- 若Content属性记录的数据类型附加了一个类型转换器(TypeConverter),WPF直接使用该转换器为Content属性创建一个UIElement类实例,并将它加入到视觉树;
- 若5中类型转换器最终将Content属性转换wie字符串,则WPF使用TextBlock对该字符串进行包装,并将此TextBlock实例添加到视觉树;
- 若上述条件均不符合,则WPF内部使用ToString将Content属性转化为字符串,包装到TextBlock后添加到视觉树。
==================================================================================
Button:
<Button Name="button1" Content="button1" Click="OnButton1Click"/>
<Button Name="button2" Content="button2"/>
<Button Name="button3" Content="button3"/>
<Button Name="button4" Content="button4"/>
public Window1()
{
InitializeComponent();
//以下3句等价
button2.Click += OnButton2Click;
button3.Click += new RoutedEventHandler(OnButton3Click);
button4.AddHandler(Button.ClickEvent, new RoutedEventHandler(OnButton4Click));
}
需要注意的是,由于按钮控件对Click高级事件的引入,Button类对MouseLeftButtonDown事件的监听不再有效。这是因为该事件的响应函数OnMouseLeftButtonDown通过更改带入参数的Handled成员为true将该事件标记为已处理。如果程序仍需对该事件进行响应,则需要使用AddHandler标识对已响应函数的处理:
button.AddHandler(Button.MouseRightButtonDownEvent, new RoutedEventHandler(OnLeftButtonDownCSharp),true);//监听右键点击
Button类较基类增加了IsCancel、IsDefault、IsDefaulted三个属性:
- IsCancel=“true”时,按下Esc键将触发该按钮的Click事件;
- IsDefault=“true”,该按钮在默认情况下具有输入焦点,并在当前焦点不在其他响应回车键的空间上时,对用户敲击回车键进行响应;
- IsDefaulted是一个只读属性,当前按钮是默认按钮且不具有当前输入焦点时其值为true,否则为false。
<StackPanel Width="100" FocusManager.FocusedElement="{Binding ElementName=defaultButton}">
<TextBox />
<Button Content="Default" IsDefault="True" Name="defaultButton" Click="OnDefault"/>
<Button Content="Cancel" IsCancel="True" Name="cancelButton" Click="OnCancel"/>
<Button Content="Empty"/>
</StackPanel>
public void OnDefault(object sender, RoutedEventArgs args)
{
if (defaultButton.IsDefaulted)
MessageBox.Show("Default Button Clicked!");
}
public void OnCancel(object sender, RoutedEventArgs args)
{
Close();
}
仅输入焦点在TextBox时,回车触发显示“Default Button Clicked!”;单击Cancel按钮或按Esc退出。
RepeatButton:
RepeatButton在按钮被按下的情况下会不停地调用Click事件的响应函数,而Button只调用一次。其调用频度取决于Delay和Interval属性。Delay表示第一次发出Click事件与按钮被按下之间的时间间隔,其默认值为SystemParameters.KeyboardDelay所记录的值;而Interval表示每次发出Click事件之间的间隔,其默认值为SystemParameters.KeyboardSpeed。RepeatButton与Button的第二个区别在于,RepeatButton直接派生自ButtonBase,因而没有IsDefault和IsCancel属性。
ToggleButton:
ToggleButton在普通按钮的基础上具有“粘连”特性——当它被点击,其IsChecked属性将被重新设置。IsChecked属性有三种取值:true、false、null,依次对应的触发事件是:Checked、UnChecked、Indeterminate。
CheckBox:
CheckBox派生自ToggleButton,无新增属性。
RadioButton:
RadioButton同样派生自ToggleButton,但新增GroupName属性。对具有同一GroupName的RadioButton,其新增是互斥的。未设定GroupName的RadioButton实例,在作为同一个元素的同级孩子节点时是互斥的。
<StackPanel DockPanel.Dock="Top" HorizontalAlignment="Stretch" Height="45">
<RadioButton IsChecked="True">Radio1</RadioButton>
<RadioButton IsChecked="True">Radio2</RadioButton>
<RadioButton>Radio3</RadioButton>
</StackPanel>
而当指定了GroupName后,具有相关该属性的RadioButton互斥,与是否为同一节点的同级孩子无关。
GridViewConlumnHeader:
GridViewConlumnHeader同样派生自ButtonBase。用列表视图显示大量数据时,单击表头对表中各项进行排序。
=================================================================================
简单容器类控件与按钮控件的最大区别在于:所有的简单容器类都直接派生自ContentControl类,没有定义Click事件,默认情况下不对点击事件进行响应。
Label和TextBlock不同:
功能上来说,Label较TextBlock最大额不同是拥有焦点设置功能。而且TextBlock中承载字符的属性是Text,该属性为String类型;而Label中承载字符的属性为Content,接受所有派生自Object的实例。
从视觉树的组成来看,Label对字符的显示是通过TextBlock来完成的,因此其运行时速度较慢。
ToolTip:
ToolTip用来完成界面显示功能,该类可以在鼠标移到控件上时显示,提供相关信息,且在鼠标离开界面元素后自动消失。
在鼠标所在位置被多个界面元素包围时,WPF选择显示最内部元素所定义的ToolTip。
Frame:略。
===============================================================================
带头标签容器类:
HeaderedContentControl派生自ContentControl后只增加了有关头标签的一些属性:HasHeader——标识其Header属性是否为null;HeaderTemplate——定义显示Header内容的模板;HeaderTemplateSelector——可以依某种自定义罗逸对HeaderTemplate进行筛选。
GroupBox:
GroupBox常用来将多个相似的元素归类到同一个组里以显示他们之间的关联。GroupBox的Header可以接受任何自Object派生的类实例,因此可以将Header设置成任何UIElement派生出的类。
由于GroupBox使用Content承载需要的内容而不是一个集合类型的属性,因此它只能承载单一的Object类或其派生类的实例。在需要显示多个对象时,要通过某种布局控件将他们组织在一起,如StackPanel、DockPanel。
Expander:
Expander与GroupBox类似,只是包含了一个控制它所记录的信息显示或隐藏的按钮,其打开方向由属性ExpandDirection设置,其值为Left、Right、Up、Down。ExpandDirectionLeft、Right时,不能设置Expander的Width、MaxWidth等属性,同样当该值为Up、Down时不能设置Hight、MaxHight。当属性IsExpanded变化时,触发Expanded和Collapse事件。
分享到:
相关推荐
比较简单的demo,但比较使用,可以下载来看看
内容控件的用法,包括Content的设置,xaml快捷键,按钮控件的属性,多选框、单选框,工具提示
引入ContentControl3D:一种控件,可轻松将3D翻转合并到任何WPF用户界面中。
WPF做的自动旋转的3d的TEXTBOX,可以用来做欢迎界面
NPOI本身是没有操作Word文档中的Bookmark标签以及内容控件的接口,我通过研究NPOI中Word文档的数据结构,实现了替换标签内容(包括删除标签)、给内容控件赋值的方法,本资源内有调用demo,解决方案是用VS2017创建的...
ContentControl3D can host any UI content on its front and back sides, and provides numerous ways to configure the animated rotations between the two sides. In addition to reviewing how to use the ...
WPF控件内容模型主要指派生于System.Windows.Controls.Control类的各种控件,其主要分为四部分: • ContentControl • HeaderedContendControl • ItemsControl • HeaderedItemsControl 其继承关系请参考我上...
用于显示气球的ContentControl 。 注意:WPF弹出窗口会裁剪到边界,因此在弹出窗口中使用连接器时会对其进行裁剪。 <geometry:Balloon Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center...
实现类似 C# TabControl 控件的效果,在同一区域实现界面的切换。通过ContentControl , Frame , Page等将生成子界面嵌入到主窗口。
CustomControl一个自定义控件/动画 库目前有六个 * CircularProgressView:圆形进度条,仿照原生 ProgressBar 的动画效果,并添加了圆形进度效果 * PieChartView: 饼图View * RulerView: 标尺View * CameraView:...
从DialogBase类继承并使用XAML设计器创建对话框,然后如果不需要对话框结果,则可以使用void DialogBase.ShowDialog(ContentControl parent = null)方法显示它,或者可以使用异步/等待模式方法Task<DialogResult> ...
看到很多IT同行找silverlight4的菜单控件,正好我写过一个,这个控件使用ContentControl.Content属性放置菜单内容,所以非常灵活。 控件不需要许可,随便使用。
silverlight4的菜单控件,使用ContentControl.Content放置菜单内容,可以支持任何类型的菜单项。这是我自己写的,大家如果需要,可以随便使用。
关于使用VSTO进行的对于Word开发的一些技术收集,包含常用的功能代码。
WPF 动态内容控件从 XAML 字符串动态呈现其内容的 WPF 控件。 ##Release NuGet 包可用。 最新版本可。 ##特征从字符串动态呈现 XAML 内容。 提供可绑定的依赖属性来设置控件的内容。 当依赖属性的上下文改变时重新...
再wpf中嵌入exe程序的例子,自带功能,供参考。
WPF 使用windows钩子监控键盘,使用windows底层api,封装为c#代码,供wpf见面调用
如果您的容器是TabControl,则持有者将是TabItem,否则它将是ContentControl。 您可以通过使用容器上附加的属性mvx:MvxContainer.HolderType来更改此设置,可以将此属性设置为您的持有人类型。 持有人标题: 您...
SilverLight中可移动弹出窗口,继承ContentControl,可设置标题,弹出位置,非模态。
本技巧介绍了一种使用ContentControl和DataTemplate轻松控制Window中的图像的方法。