`
joking0ne
  • 浏览: 9421 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

Content与ContentControl类:Button

阅读更多

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:

  1. 若Content属性属于UIElement类的派生类,则直接将他加到视觉树;
  2. 若ContentTemplate属性被设置,那么根据ContentTemplate记录的模板创建一个用来显示Content的界面元素实例并将它添加到视觉树;
  3. 若ContentTemplateSelector属性被设置,那么根据其记录的模板选择一个适当的模板,并根据此模板按照2创建Content属性的视觉树;
  4. 若Content属性记录的数据类型具有一个数据模板(DateTemplate),那么使用它作为Content属性创建界面元素;
  5. 若Content属性记录的数据类型附加了一个类型转换器(TypeConverter),WPF直接使用该转换器为Content属性创建一个UIElement类实例,并将它加入到视觉树;
  6. 若5中类型转换器最终将Content属性转换wie字符串,则WPF使用TextBlock对该字符串进行包装,并将此TextBlock实例添加到视觉树;
  7. 若上述条件均不符合,则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事件。

 

分享到:
评论

相关推荐

    wpf tab切换--contentControl demo

    这个“wpf tab切换--contentControl demo”提供了一个简单的示例,帮助开发者更好地理解和应用TabControl与ContentControl的交互。 **TabControl基础** TabControl由一系列TabItems组成,每个TabItem包含一个标题...

    ContentControl.rar

    本文将深入探讨“ContentControl”的使用方法,包括如何设置Content,掌握XAML的快捷键,理解按钮控件的属性,以及多选框、单选框的使用,以及工具提示的应用。 首先,ContentControl是WPF中一个基础且灵活的控件,...

    WPF控件和布局

    ContentControl族的控件有一个名为Content的属性,它们只能有一个元素作为内容。例如,Button控件可以包含一个TextBox,但只能有一个,这展示了ContentControl的特性。 **6. 布局模型** 布局控件(如Grid、...

    WPF子界面嵌入主窗口示例代码

    &lt;Button Content="切换到Page2" Click="SwitchToPage2"/&gt; ``` 总结,WPF提供了一种灵活的方式来实现子界面的嵌入和切换,不局限于使用TabControl。通过ContentControl和Frame的组合,我们可以轻松地管理多个Page...

    WPF经典教程之WPF控件内容模型

    在示例代码中,Button的Content属性被用来设置一个包含图像和文本的StackPanel,这显示了ContentControl可以容纳复杂对象的能力。 2. **HeaderedContentControl** - 这个模型扩展了ContentControl,增加了一个...

    WPF 控件内容模型

    在示例代码的第17-24行中,`Button`就是一个`ContentControl`的例子,它的内容(`Content`)是一个包含图像和文本的`StackPanel`。 2. **HeaderedContentControl**: 这个类扩展了`ContentControl`,添加了一个可...

    wpf控制項教學

    这些控件继承自ContentControl类,它们有一个名为Content的属性,可以容纳任何类型的对象。ContentControl类还有另一个有趣的成员属性HasContent,用于指示Content属性是否包含对象。如果Content属性为null,则...

    silverlight4的菜单控件

    ContentControl是Silverlight中的一个基础类,它的Content属性可以承载任何可以呈现的对象,这使得我们可以轻松地将菜单项的内容(如文本、图像或复杂的UI元素)绑定到控件上。 实现这样的自定义菜单控件,首先需要...

    wpf经典入门教程

    2. **ContentControl**:此类控件可以包含单个内容,如Label、Button等,可以通过Content属性设置内容。 3. **ItemsControl**:用于显示一组数据集合,如ListBox、ListView。它们可以使用数据模板将数据项转换为可...

    WPF 基础视频教程(共50集)-14.特殊容器控件

    Button、Label等控件实际上都是ContentControl的派生类。 3. **TabControl**: TabControl是一个能够展示多个内容面板,并且每个面板可以通过标签页进行切换的控件。它结合了ContentControl和ItemsControl的功能,...

    WPF学习知识总结

    &lt;ContentControl Content="{TemplateBinding Button.Tag}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="2,0,2,0"/&gt; &lt;TextBlock Text="{TemplateBinding Content}" Width="{TemplateBinding Width...

    WPF原创教程(PPT)——Class3. WPFControl

    &lt;Button Content="Help"/&gt; &lt;Button Content="OK"/&gt; ``` ### 4. 内容模型(Content Model) WPF控件有多种内容模型,如: - **ContentControl**:可以包含单个项。 - **HeaderedContentControl**:具有标题和...

    wpf基本控件的使用

    子类如Button、Label等都是基于ContentControl的。 2. **Button**: 基本的按钮控件,用户可以通过点击执行相应的操作。`Content`属性可以设置按钮上显示的文本或图像。 3. **Label**: 用于展示提示性文字,通常与...

    WPF控件的使用

    1. **按钮(Button)**:作为最常见的控件,Button用于触发一个操作或事件。你可以设置按钮的文本、样式以及点击事件的处理函数。 2. **文本框(TextBox)**:TextBox用于接收用户的输入。可以设置其文本、字体、大小,...

    TabControlWithClose.zip

    ContentControl content = new ContentControl(); // 设置新内容 content.Content = new MyUserControl(); // 假设MyUserControl是你的用户控件 newTab.Content = content; .TabControlWithClose.Items.Add(new...

    Windows程序设计(C#-WPF))试卷

    DataTemplate常用于`ContentControl`的`ContentTemplate`属性、`ItemsControl`的`ItemTemplate`属性以及`GridViewColumn`的`CellTemplate`属性中,但不适用于`UserControl`的`ControlTemplate`属性,后者用于定义...

    WPF的控件编程、面板布局、2D图形等具体内容。

    &lt;Label Name="lblInstructions" Foreground="DarkGreen" Content="选择你的选项,按下提交"/&gt; &lt;!-- 更多内容 --&gt; &lt;/Button&gt; ``` 在这个例子中,`Button`控件包含了`StackPanel`,而`StackPanel`又包含了`...

    WPF极简NavBar(导航栏),源码可以直接运行

    通过设置Button的Content属性,可以绑定到ViewModel中的导航标题。 **6. 导航和视图切换** 实现视图切换通常有两种方式:使用Frame控件和ContentControl。Frame可以加载其他XAML页面,而ContentControl则可以动态地...

    Creating an Outlook Calendar Using WPF

    每个视图对应一个DataTemplate,ContentControl的Content属性绑定到当前选定的视图模型,根据选定的视图类型动态加载相应的模板。 最后,为了保存和加载用户的日历数据,我们可以使用XML序列化或SQLite数据库。XML...

Global site tag (gtag.js) - Google Analytics