跟我一起学WPF(3):WPF控件基础

WPF控件简介

通过上一篇XAML语言的介绍,我们知道,XAML是一个树形结构,同样,WPF控件作为构成整个XAML树的一部分,也是一个树形结构。我们看一个简单的例子。

<Button.Content>
        <DockPanel>
             <Image Source="F:\01.Code\01.MyCode\WpfApplication1\WpfApplication1\Resources\荷.jpg" Width="30"/>
             <TextBlock Text="红色" Foreground="Red" VerticalAlignment="Center"></TextBlock>
             <TextBlock Text="绿色" Foreground="Green" VerticalAlignment="Center"/>
             <TextBlock Text="蓝色" Foreground="Blue" VerticalAlignment="Center"/>
         </DockPanel>
 </Button.Content>

界面展现效果如图:

没有接触过WPF的朋友可能会惊讶,一个button里怎么会有那么多内容?我们可以通过VS的对象浏览器查看Button类的继承关系为:

Button->ButtonBase->ContentControl->Control->FrameworkElement。

FrameworkElement是所有WPF界面元素的展现基类(FrameworkElement向上继承自UIElement->Object),Button继承ContentControl,使得Button具备了一个容器控件应有的特性,即允许Button拥有一个Content,而这个Content可以为另一个容

器或控件,至于里面具体是什么,完全取决于你想要什么。这也正是WPF的魅力所在,任何控件都是一个树形结构,且树形结构的每一级都可以自由定制,理论上我们可以自定义任何一个层级的样式,来实现任何我们想要的界面展现效果。

WPF控件分类

上面我们讲到了Button继承自ContentControl,应该说是属于一个内容控件,下面我们系统的对WPF控件进行一下分类,按照我自己的理解,我们有两种分类方法。

一、按照控件的继承特性分类

我们先看一下整个WPF界面元素类之间的继承关系:

  • Panel:布局控件,包括Canvas、DockPanel、StackPanel等,可以容纳多个基本控件(Control)或者嵌套其他布局控件。用于整体界面的布局,Panel下的控件我们会在下一篇讲解。
  • Control:基本控件
  • ContentControl:内容控件,其内容只能是一个基本控件或布局控件,通常使用一个布局控件作为其Content,然后在布局空间里使用多个基本空间,从而实现复杂的界面效果,其下基本控件有Label、Button、Tooltip。
  • HeaderContentControl:带标题的内容控件,继承自ContentControl,在ContentControl的基础上,增加了一个Header属性。其下基本控件有TabItem、GroupBox等
  • ItemsControl:多条目控件,其下基本控件有ListBox、Menu等
  • HeaderItemsControl:继承自ItemsControl,增加了Header属性,其下控件有MenuItem、TreeViewItem、ToolBar等
  • TextBox:基本文本输入控件。
  • TextBlock、Image:直接继承自FrameworkElemet基类,属于最普通的基本控件。

二、按照控件的感官特性分类

这里的感官特性我定义的是,站在一个普通用户的角度上,能看到、感知到的东西。这里讲WPF控件分为两类:

1、 基本控件:用户可以看到并与之交互的控件,如按钮、输入框等,主要涵盖上述的Control、TextBlock、Image部分

2、 布局控件:用户察觉不到的,却对这个系统界面布局有着决定性作用的容器类控件,主要涵盖上述Panel及其子类部分

文章在以后的描述中将以这种分类方法进行阐述。

WPF控件属性

通过上面的介绍,我们知道所有的控件(基本控件、容器控件)都继承自FrameworkElement这个基类,这个基类里定义了WPF控件用到的大部分属性,我们这里先对这些WPF控件都具有的属性进行介绍(常用的标红),后续分别介绍常用基本控件时再对独有的属性进行介绍。

  • ActualHeight:获取此元素的呈现高度。
  • ActualWidth:获取次元素的呈现宽度。
  • BindingGroup:获取或设置用于该元素的 System.Windows.Data.BindingGroup
  • ContextMenu:获取或设置该元素的上下文菜单,通常是邮件菜单。
  • Cursor:获取或设置当鼠标指针悬停在此元素上时显示的光标
  • DataContext:获取或设置元素参与数据绑定时的数据上下文。
  • DefaultStyleKey:在使用或定义主题样式时,获取或设置用于引用此控件的样式的键。
  • FlowDirection:获取或设置文本和其他UI元素在控制它们布局的任何父元素中的流动方向。是一个枚举值。默认值为 System.Windows.FlowDirection.LeftToRight
  • FocusVisualStyle:获取或设置一个属性,该属性支持自定义将在此元素捕获键盘焦点时应用于此元素的外观、效果或其他样式特征
  • ForceCursor:获取或设置一个值,该值指示此元素是否应该强制UI按照Cursor属性所声明的方式呈现光标。
  • Height:获取或设置元素的建议高度。
  • HorizontalAlignment:获取或设置在父元素(如面板或项控件)中构成此元素时应用于此元素的水平对齐特征。
  • InputScope:获取或设置此元素使用的输入上下文
  • IsInitialized:获取一个值,该值指示此元素是否已初始化。
  • IsLoaded:获取一个值,该值指示是否已加载此元素以供呈现。
  • Language:获取或设置适用于某个元素的本地化/全球化语言信息
  • LayoutTransform:获取或设置在执行布局时应该应用于此元素的图形转换方式。
  • LogicalChildren:获取此元素的逻辑子元素的一个枚举器。
  • Margin:获取或设置元素的外边距。认值是所有属性都等于 0(零)的 System.Windows.Thickness。
  • MaxHeight:获取或设置元素的最大高度约束。
  • MaxWidth:获取或设置元素的最大宽度约束。
  • MinHeight:获取或设置元素的最小高度约束。
  • MinWidth:获取或设置元素的最小宽度约束。
  • Name:获取或设置元素的标识名称。该名称提供一个引用,以便当 XAML 处理器在处理过程中构造标记元素之后,后台代码可以对该元素进行引用。
  • OverridesDefaultStyle:获取或设置一个值,该值指示此元素是否合并了主题样式中的样式属性。
  • Parent:获取此元素的逻辑父级元素。
  • Resources:获取或设置本地定义的资源字典。
  • Style: 获取或设置此元素在呈现时使用的样式。
  • Tag: 获取或设置一个可用于存储有关此元素的自定义信息的任意对象值。
  • TemplatedParent: 获取一个对此元素的模板父级的引用。如果此元素不是通过模板创建而成,则此属性并不相关
  • ToolTip: 获取或设置在UI中为此元素显示的工具提示对象。
  • Triggers: 获取直接在此元素上建立或在子元素中建立的触发器的集合。
  • VerticalAlignment:获取或设置在父元素(如面板或项控件)中组合此元素时应用于此元素的垂直对齐特征。
  • VisualChildrenCount: 获取此元素内的可视化子元素的数目。
  • Width: 获取或设置元素的宽度。

       其中读写属性(带有获取或设置描述的属性)可以在XAML中使用,只读属性(只有获取描述的属性)只能在后台代码中使用。

WPF控件声明

通过一个简单的Button的定义阐述一下Wpf控件的使用

1、 在XAML中声明

可以从工具箱找到Button控件直接拖拽到窗体上,然后会在相应位置生成一条XAML语句,个人推荐使用手写XAML的方式,确保控件出现在你想要的地方。

<Button Height="30" Width="120" Name="myButton"/>

这条语句声明了一个Button对象,且该Button对象的名称为myButton,高度为30,宽度120,我们在后台代码可以直接访问并使用这个对象,如:通过

mybutton.Height=25;可将该Button对象的高度修改为25。

2、 在后台.CS代码中声明

Button myButton = new Button();

myButton.Height = 30;

myButton.Width = 100;

下一篇我们将学习WPF中Label、TextBLock、Button、TextBox等基本控件的使用方法。

时间: 2025-01-31 01:22:41

跟我一起学WPF(3):WPF控件基础的相关文章

WPF多线程访问控件

大家知道WPF中多线程访问UI控件时会提示UI线程的数据不能直接被其他线程访问或者修改,该怎样来做呢? 分下面两种情况 1.WinForm程序 1 2 1)第一种方法,使用委托: 3 private delegate void SetTextCallback(string text); 4 private void SetText(string text) 5 { 6 // InvokeRequired需要比较调用线程ID和创建线程ID 7 // 如果它们不相同则返回true 8 if (thi

WPF中Ribbon控件的使用

这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可以找到想要的Menu.在Outlook 2003时代,将Home下面的Menu都垂直的排列下来,操作的便捷程度降低了很多.Ribbon的布局会随着窗体的变化动态的调整. 上面的图片中标注了Ribbon的4个区块. 下面我们就在WPF中使用Ribbon控件来实现一个简单的界面. 1. 添加System

Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfrom控件的问题,我们知道Wpf可以通过使用WindowsFormsHost容器调用Winform控件,但是在一些场合需要将Wpf元素显示在Winform控件的上层,此时就会出现Wpf元素被Winform控件遮盖的问题. 一.场景再现 接到公司命令,在时间紧迫的情况下,需要将原来的Winform程序(

Xceed WPF 主题皮肤控件Xceed Professional Themes for WPF详细介绍

Xceed Professional Themes for WPF是一款为你的整个应用程序提供完美WPF主题风格的控件,包含Office 2007和Windows 7,可以应用到任何微软官方的WPF控件. 具体功能: WPF/.NET技术: 完全基于WPF创建,由C#和XAML编写,适用于.NET 3.5和4.0 完整的XAML源代码可用 兼容CLS 完全整合帮助文档到Visual Studio里 主要功能: 提供了7种预定义WPF主题风格 Glass 主题风格 Media 主题风格,使您的应用

WPF送走控件的focus方法

我们可以调用Focus()方法,让WPF控件获得焦点, 那我现在不想要焦点了, 如何把这个包袱抛出去? 可以,  恩, 没有Unfocus(), 但下面的方法也许可行(把焦点抛给另一个不知道的控件): myControl.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); WPF送走控件的focus方法,布布扣,bubuko.com

在WPF的WebBrowser控件中屏蔽脚本错误的提示

在WPF中使用WebBrowser控件显示网页时,经常会报脚本错误的提示,如何屏蔽掉这些错误提示呢.方法是定义如下方法: public void SuppressScriptErrors(WebBrowser wb, bool Hide) { FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);

InteropBitmap指定内存,绑定WPF的Imag控件时刷新问题。

1.InteropBitmap指定内存,绑定WPF的Imag控件的Source属性 创建InteropBitmap的时候,像素的格式必须为PixelFormats.Bgr32, 如果不是的话在绑定到Image控件的Source属性,刷新新界面(BitmapSource.Invalidate())的时候会造成内存泄露. 2. 内存映射: //内存共享类 internal class Win32Mess { [DllImport("VCamBridge.dll", EntryPoint =

在WPF程序中将控件所呈现的内容保存成图像(转载)

在WPF程序中将控件所呈现的内容保存成图像 转自:http://www.cnblogs.com/TianFang/archive/2012/10/07/2714140.html 有的时候,我们需要将控件所呈现的内容保存成图像保存下来,例如:InkCanvas的手写墨迹,WebBrowser中的网页等.可能有人会说,这个不就是截图嘛,找到控件的坐标和大小,调用截图API不就可以了嘛.的确,对于规则的控件来说,通过截图的却可以实现,可是,如果控件不规则或不透明度不是100%,则会把其背景控件的视觉效

WPF 添加ACTIVEX 控件 ——System.Windows.Forms.AxHost+InvalidActiveXStateException异常

---恢复内容开始--- 一.ACTIVEX及其相关概念 COM(Component Object Model,对象组件模型): DCOM(Distributed COM,分布式对象组件模型): CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构): 动态数据交换(Dynamic Data Exchange,DDE),解决了数据的更新,但数据格式仍是问题: 对象的链接与嵌入(Object Linking and Embedde

WPF的ListView控件自定义布局用法实例

本文实例讲述了WPF的ListView控件自定义布局用法.分享给大家供大家参考,具体如下: 概要: 以源码的形式贴出,免得忘记后,再到网上查资料.在VS2008+SP1环境下调试通过 引用的GrayscaleEffect模块,可根据参考资料<Grayscale Effect...>中的位置下载. 正文: 如何布局是在App.xaml中定义源码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27