添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

【C# .NET】WPF (五) 常用控件 之 内容控件 (ContentControls)

WPF常用控件

WPF 的所有控件都是从 System.Windows.Controls.Control 类中派生出来,其命名空间是System.Windows.Controls 。

WPF有两个类似的类继承树,一个与界面( UI )相关,如 UIElement 类;另一个与内容( Content )相关,如 ContentElement。

ContentElement 支持文本方式,而 UIElement 则支持图形方式。

Control 类中派生出来的控件,基本上可以分为4类:

  1. 内容控件(ContentControls)
  2. 条目控件(ItemsControls)
  3. 文本控件(TextControls)
  4. 范围控件(RangeControls)

内容控件(ContentControls)继承树:



5. 内容控件(ContentControls)

内容控件是 WPF 控件中的一大类,ContentControl 直接从 Control 类中派生出来。

1)内容控件包括:

  1. Frame(框架控件)

2. Button(普通按钮)

3. ToggleButton(拨动按钮)

4. CheckBox(选择控件)

5. RadioButton(单选按钮)

6. RepeatButton(重复按钮)

7. HeaderedContentControl(标题栏内容控件)

8. GroupBox(分组框)

9. Expander(伸展控件)

10. Lable(标签控件)

ContentControls 中常用控件:


5.1 框架控件(Frame)

框架控件的主要作用是把其中的内容和界面上其他部分分开,它里面可以含有任何东西,但只能有一个直接的子控件。

例子:

    <StackPanel>
        <Frame>
            <Frame.Content>
                <Button Content="Button" Foreground="Black" FontSize="50"/>
            </Frame.Content>
        </Frame>
    </StackPanel>


Frame可以嵌入HTML ,例子:

    <StackPanel>
        <Frame Source="https://www.baidu.com/" Foreground="White"/>
    </StackPanel>
Frame 只能是简单的嵌入 HTML,通常用于静态页面,无法进行动态加载
动态加载需要引用另一个框架,这里不进行讲解,感兴趣的同学可以私聊我发教程

5.2 通用按钮基类 (ButtonBase)

WPF 中的按钮都是从 ButtonBase 抽象类中派生出来。

ButtonBase 常用属性 描述
Name 获取或设置元素的唯一标识名称
Background 获取或设置控件填充背景画笔
Foreground 获取或设置控件前景色的画笔
BorderBrush 获取或设置控件边框颜色画笔
BorderThickness 获取或设置控件的边框宽度
Opacity 获取或设置控件的不透明度
Content 获取或设置控件中的文字内容
Margin 获取或设置元素的外边距
MaxHeight 获取或设置元素的最大高度约束
MaxWidth 获取或设置元素的最大宽度约束
MinHeight 获取或设置元素的最小高度约束
MinWidth 获取或设置元素的最小宽度约束
Height 获取或设置元素的高度
Width 获取或设置元素的宽度
HorizontalAlignment 获取或设置在父元素中此元素的水平对齐方式
HorizontalContentAlignment 获取或设置控件内容的水平对齐方式
VerticalAlignment 获取或设置在父元素中此元素的垂直对齐方式
VerticalContentAlignment 获取或设置控件内容的垂直对齐方式
Visibility 获取或设置此元素的可见性
Cursor 获取或设置在鼠标位于此元素上时显示的光标
FontFamily 获取或设置控件的字体系列
FontSize 获取或设置字号
FontWeight 获取或设置指定字体的粗细
Command(重点) 获取或设置在按下按钮时调用的命令
CommandParameter(重点) 获取或设置要传递给 Command 属性的参数
CommandTarget(重点) 获取或设置要引发指定命令的对象
ContentTemplate(重点) 获取或设置用于显示 ContentControl 内容的数据模板
ContentTemplateSelector(重点) 获取或设置一个模板选择器,以使应用程序编写器能够提供自定义模板选择逻辑
Template(重点) 获取或设置控件模板
Style(重点) 获取或设置此元素呈现时所使用的样式
ToolTip 获取或设置在用户界面中为此元素显示的工具提示对象
Triggers(重点) 获取直接在此元素上或在子元素中建立的触发器的集合
IsCancel 获取或设置一个值,该值指示 Button 是否是一个“取消”按钮。 用户可以通过按 ESC 键来激活 Cancel 按钮
IsDefault 获取或设置一个值,该值指示 Button 是否是一个默认按钮。 用户可以通过按 ENTER 键调用默认按钮
ClickMode 获取或设置 Click 事件何时发生
属性太多,这里就不一一演示,有兴趣的同学自行摸索,标注重点的,是真的非常重点


ButtonBase 常用事件 描述
Click 在单击 Button 时发生
MouseDoubleClick 在双击或多次单击鼠标按钮时发生
MouseDown 在鼠标位于此元素上并且按下任意鼠标按钮时发生
MouseEnter 在鼠标进入此元素的边界时发生
MouseLeave 在鼠标离开此元素的边界时发生
MouseLeftButtonDown 在鼠标位于此元素上并且按下鼠标左键时发生
MouseLeftButtonUp 在鼠标位于此元素上并且松开鼠标左键时发生
MouseMove 在鼠标位于此元素上并且移动鼠标指针时发生
MouseRightButtonDown 在鼠标位于此元素上并且按下鼠标右键时发生
MouseRightButtonUp 在鼠标位于此元素上并且松开鼠标右键时发生
MouseUp 在鼠标位于此元素上并且松开任意鼠标按钮时发生
MouseWheel 在鼠标位于此元素上并且用户滚动鼠标滚轮时发生

5.3 普通按钮(Button)

1)点击状态触发事件:

XAML代码:

    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button Name="btn1" Background="LightCoral" Click="OnClick1" ClickMode="Hover"
                Height="50" Width="200">Hover 悬停鼠标</Button>
        <Button Name="btn2" Background="LightBlue"  Click="OnClick2" ClickMode="Press"
                Height="50" Width="200">Press 按下鼠标</Button>
        <Button Name="btn3" Background="LightGreen" Click="OnClick3" ClickMode="Release"
                Height="50" Width="200">Reset 释放鼠标</Button>
    </StackPanel>

C#代码:

    public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
        void OnClick1(object sender, RoutedEventArgs e)
            btn1.Background = Brushes.Blue;
        void OnClick2(object sender, RoutedEventArgs e)
            btn2.Background = Brushes.Red;
        void OnClick3(object sender, RoutedEventArgs e)
            btn1.Background = Brushes.Yellow;
            btn2.Background = Brushes.Violet;

运行演示:

点击状态触发事件都是由鼠标左键触发


2)鼠标状态触发事件:

XMAL代码:

    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button Background="LightGreen" Height="50" Width="200"
                MouseEnter="btn1_MouseEnter" 
                MouseLeave="btn1_MouseLeave" 
                MouseDown="btn1_MouseDown" 
                MouseUp="btn1_MouseUp" 
                MouseDoubleClick="btn1_MouseDoubleClick"
                >鼠标事件</Button>
        <Button Name="btn1" Background="LightYellow" Height="50" Width="200" Content="鼠标状态"/>
    </StackPanel>

C#代码:

    public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
        private void btn1_MouseEnter(object sender, MouseEventArgs e)
            btn1.Content = "鼠标进入";
            btn1.Background = Brushes.White;
        private void btn1_MouseLeave(object sender, MouseEventArgs e)
            btn1.Content = "鼠标离开";
            btn1.Background = Brushes.Gray;
        //按下鼠标右键
        private void btn1_MouseDown(object sender, MouseButtonEventArgs e)
            btn1.Content = "按下鼠标右键";
            btn1.Background = Brushes.Blue;
        //抬起鼠标右键
        private void btn1_MouseUp(object sender, MouseButtonEventArgs e)
            btn1.Content = "抬起鼠标右键";
            btn1.Background = Brushes.Orange;
       //双击鼠标左键
        private void btn1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
            btn1.Content = "双击鼠标左键";
            btn1.Background = Brushes.Red;

运行演示:


5.4 拨动按钮(ToggleButton)

拨动按钮的特性就像拨动开关,按一下拨动按钮,其 IsChecked 属性变为 True;再按一下拨动按钮,其 IsChecked 属性变为 False 。

有时,我们需要拨动按钮维持三个状态,这时我们把 IsThreeeState 属性设为 True ,这时,IsChecked 的属性值可取三个值: True, False 和 Null 。

常用事件 发生小件
Checked 当 IsChecked 为 True 时,产生该事件
UnChecked 当 IsChecked 为 False 时,产生该事件
Indeterminate 当 IsChecked 为 Null 时,产生该事件
一般并不直接创建 ToggleButton 实例,因为WPF没有提供现成的样式模版,所以通常使用其派生类:CheckBox 和RadioButton。

样式模版参考:


5.5 选择控件(CheckBox)

CheckBox 控件用在可以有多个选项,而又可以同时选择两个或两个以上选项的情况下,CheckBox 没有增加任何属性,它为 ToggleButton 提供外观。

XAML代码:

    <StackPanel>
        <TextBlock Text="CheckBox" Margin="5,20,10,20" FontSize="18" 
                   FontWeight="Bold" Foreground="Orange"/>
        <CheckBox Margin="5,0,0,0" Content="Three-state CheckBox" Foreground="White" 
                  IsThreeState="True" FontSize="15" ToolTip="Tips"
                  Unchecked="HandleUnchecked" Checked="HandleCheck"
                  Indeterminate="HandleThirdState"/>
        <TextBlock x:Name="text1" Foreground="LightGreen"  Margin="5,5,0,0" FontSize="15"/>
    </StackPanel>

C#代码:

    public partial class MainWindow : Window
        public MainWindow()
            Initial如果izeComponent();
        private void HandleCheck(object sender, RoutedEventArgs e)
            text1.Text = "The CheckBox is checked.";
        private void HandleUnchecked(object sender, RoutedEventArgs e)
            text1.Text = "The CheckBox is unchecked.";
        private void HandleThirdState(object sender, RoutedEventArgs e)
            text1.Text = "The CheckBox is in the indeterminate state";

运行演示:


5.6 单选按钮(RadioButton)

在一组选项里面,必须且只能选择一个选项时,使用 RadioButton。

RadioButton并不提供“不选”操作,要去掉某个选项的方法是选择另一个选项。

XAML代码:

    <StackPanel>
        <RadioButton Checked="WriteText2" Foreground="White" Margin="55,5">Yes</RadioButton>
        <RadioButton Checked="WriteText2" Foreground="White" Margin="55,5">No</RadioButton>
        <RadioButton Checked="WriteText2" Foreground="White" Margin="55,5">opinion</RadioButton>
        <RadioButton Checked="WriteText2" GroupName="class" Foreground="White" Margin="55,5">一班</RadioButton>
        <RadioButton Checked="WriteText2" GroupName="class" Foreground="White" Margin="55,5">二班</RadioButton>
        <RadioButton Checked="WriteText2" GroupName="class" Foreground="White" Margin="55,5">三班</RadioButton>
        <TextBlock x:Name="txtb" Margin="5" Foreground="LightGreen"/>
    </StackPanel>

C#代码:

    public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
        void WriteText2(object sender, RoutedEventArgs e)
            RadioButton li = (sender as RadioButton);
            txtb.Text = "你选择: " + li.Content.ToString() + ".";

运行演示:

所以说,如果只有一个单选组的情况下, 可以不用设置分组,各组之间互不干涉

5.7 重复按钮(RepeatButton)

重复按钮可以在按下鼠标左键至施放按钮期间,不停地发出单击 Click 事件。

这种特性在某些情况下很有用,比如视频的快进或快退键。

常用属性 描述
Delay 获取或设置开始重复 前 被按下时等待的时间(以毫秒为单位)。 该值必须为非负数
Interval 获取或设置开始重复 后 重复之间的时间间隔(以毫秒为单位)。 该值必须为非负数

XAML代码:

    <StackPanel>
        <RepeatButton Width="200" Height="50" Delay="500" Interval="100" 
                      Click="Increase" FontSize="30">增加</RepeatButton>
        <TextBlock Name="valueText" Width="100" TextAlignment="Center" 
                   FontSize="50" Foreground="LightGreen">0</TextBlock>
        <RepeatButton Width="200" Height="50" Delay="500" Interval="100" 
                      Click="Decrease"  FontSize="30">减少</RepeatButton>
    </StackPanel>


C#代码:

    public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
        void Increase(object sender, RoutedEventArgs e)
            Int32 Num = Convert.ToInt32(valueText.Text);
            valueText.Text = ((Num + 1).ToString());
        void Decrease(object sender, RoutedEventArgs e)
            Int32 Num = Convert.ToInt32(valueText.Text);
            valueText.Text = ((Num - 1).ToString());

5.8 标题栏内容控件(HeaderedContentControl)

标题栏内容控件一般用在需要带有标题的情况,它并没有太大的作用,通常我们不直接使用 HeaderedContentControl 控件,而是使用他的派生类:分组框和伸展控件。

常用属性 描述
Header 获取或设置标题
BorderThickness 获取或设置边框线条大小
Foreground 获取或设置边框颜色


    <StackPanel>
        <HeaderedContentControl Width="200" Height="200" BorderBrush="White" BorderThickness="5" >
            <HeaderedContentControl.Header>
                <TextBlock Background="Gray" FontSize="20" Foreground="White" Text="我是标题"/>
            </HeaderedContentControl.Header>
            <HeaderedContentControl.Content>
                <StackPanel>
                    <TextBlock Text="我是内容" FontSize="15" Foreground="LightGreen"/>
                </StackPanel>
            </HeaderedContentControl.Content>
        </HeaderedContentControl>
    </StackPanel>

5.9 分组框(GroupBox)

分组框(GroupBox)作用是把一些相近的控件放在一起,同时用一个带标题的边框把它们组合起来。

XAML代码:

    <TabControl Background="#FF3C3C3C">
        <TabItem Header="Table1" Background="Green" Foreground="Black">
            <GroupBox Header="我是标题1" BorderThickness="2" BorderBrush="Yellow"
                      Margin="5" Foreground="White">
                <GroupBox.Content>
                    <TextBlock Margin="10" Text="内容1" FontSize="15" Foreground="LightGreen"/>
                </GroupBox.Content>
            </GroupBox>
        </TabItem>
        <TabItem Header="Table2" Background="Yellow" Foreground="Green">
            <GroupBox Margin="5" BorderThickness="2" Foreground="White" Header="我是标题2">
                <StackPanel Margin="10">
                    <RadioButton Foreground="LightBlue" FontSize="15">一班</RadioButton>
                    <RadioButton Foreground="LightBlue" FontSize="15">二班</RadioButton>
                    <RadioButton Foreground="LightBlue" FontSize="15">三班</RadioButton>
                    <RadioButton Foreground="LightBlue" FontSize="15">四班</RadioButton>
                </StackPanel>
            </GroupBox>
        </TabItem>
    </TabControl>
实际上分组框仅仅只是起到一个边框加标题的作用,内容你可以是任意控件,例如,你把TextBlock 和 Button 组合放一起,也是没问题,只要是继承自 ContentControl 类的控件都可以。

5.10 伸展控件(Expander)

伸展控件可以将内容压缩,在需要时,才展示内容,可以极大的节省页面空间。

常用属性 描述
ExpandDirection 获取或设置伸缩方向
IsExpanded 获取或设置默认伸展方式

XAML代码:

    <StackPanel>
        <Expander Header="年度最佳班级" Background="Tan" HorizontalAlignment="Left" 
                  ExpandDirection="Down" IsExpanded="True" Height="220" Width="495">
            <StackPanel Margin="10">
                <RadioButton Content="一班" FontSize="16"/>
                <RadioButton Content="二班" FontSize="16"/>
                <RadioButton Content="三班" FontSize="16"/>
                <RadioButton Content="四班" FontSize="16"/>
            </StackPanel>
        </Expander>
    </StackPanel>

5.11 标签控件(Lable)

标签控件可以在窗口的某个地方显示字符串。

在WPF里,TextBlock 和 TextBox 等都可以用来显示字符串。标签控件区别于 TextBlock 和TextBox 的功能主要有两点:

1.在默认的情况下,标签控件是只读的,颜色是灰色的;

2.标签控件内置了一个AccessText控件,可以直接设定热键到目标控件。

XAML代码:

    <StackPanel Orientation="Vertical">
        <Label Target="{Binding ElementName=tb}" Foreground="LightGreen" Content="快捷键(_p)"/>
        <TextBox x:Name="tb" Text="同时按下 Alt 和 p 键,可获取输入焦点"/>
        <Label Target="{Binding ElementName=tb1}" Foreground="LightGreen" Content="快捷键(_o)"/>
        <TextBox x:Name="tb1" Text="同时按下 Alt 和 o 键,可获取输入焦点"/>
    </StackPanel>


温馨提示,如果需要显示经常变更的文字内容,请使用 TextBlock 而不要使用 Label,这样性能会更好,因为 Label 由 Border、ContentPresenter、AccessText 和 TextBlock 等几个控件组成

5.12 热键设置(AccessText)

通过 AccessText 标记创建一个 AccessKey ,用下划线来指定用作访问键的字符。如果内容包含多个下划线字符,则只会将第一个下划线字符转换为 AccessKey 其他下划线将显示为普通文本。 如果要转换为访问键的下划线不是第一个下划线,则使用两个连续的下划线。

前面介绍了 Label 可以设置热键,事实上,大部分控件都能设置热键。

XAML代码:

    <StackPanel Orientation="Vertical">
        <Button Height="50" Width="200" HorizontalAlignment="Center">
            <AccessText Text="我有热键 _p"/>
        </Button>
        <TextBlock Height="50" Width="200" HorizontalAlignment="Center" Background="LightBlue">
            <AccessText  Text="我有热键 _t"/>
        </TextBlock>
        <CheckBox Width="200">
            <AccessText Text="我有热键 _c" Foreground="LightGreen"/>
        </CheckBox>
        <RadioButton Width="200">
            <AccessText Text="我有热键 _a" Foreground="LightGreen"/>
        </RadioButton>
    </StackPanel>

5.13 提示控件(ToolTip)

提示控件,该控件可创建一个弹出窗口,以便在界面中显示元素的信息。

常用属性 描述
IsOpen 获取或设置 ToolTip 是否可见
Placement 获取或设置 ToolTip 控件打开时的方向,并指定 ToolTip 控件在与屏幕边界重叠时的行为
PlacementRectangle 获取或设置 ToolTip 控件打开时所在位置与之相关的矩形区域
StaysOpen 获取或设置 ToolTip 是否一直保持打开状态,直到用户在鼠标不在 ToolTip 上时单击鼠标


XAML代码:

    <StackPanel Orientation="Vertical">
        <TextBox HorizontalAlignment="Left" Height="30" Width="200">鼠标移动到此处会出现提示框
            <TextBox.ToolTip>
                <ToolTip >
                    <StackPanel Orientation="Vertical">
                        <Image Source="./Image/liulanqi.png"/>
                        <TextBlock>这是一个有意思的提示框</TextBlock>
                        <Button Content="我是Button" Background="LightBlue"/>
                    </StackPanel>
                </ToolTip>
            </TextBox.ToolTip>
        </TextBox>
    </StackPanel>

运行演示:

使用ToolTip需要注意下述两点:

1. ToolTip 虽然是一个控件,但其本身不具备接收用户输入的功能。比如上面的例子中,在ToolTip 中使用了 Button,你就无法点击 Button。

2. ToolTip 虽然是一个控件,但它不能像其他控件那样作为其他控件的子控件,它必须和某个控件的 ToolTip 属性相连。


5.14 滚动条(ScrollViewer)

当窗口中的内容比窗口的大小要大时,通常要在窗口中显示滚动条。在WPF中显示滚动条要用到ScrollViewer类,这是一个内容控件,和所有的内容控件一样,它只能含有一个子控件。

CanContentScroll 获取或设置窗口是否支持滚动
HorizontalScrollBarVisibility 获取或设置是否显示水平滚动条
VerticalScrollBarVisibility 获取或设置是否显示垂直滚动条
PanningDeceleration 获取或设置滚动条的滚动速率
    <ScrollViewer HorizontalScrollBarVisibility="Auto">
        <StackPanel>
            <Button Content="Start" HorizontalAlignment="Center" Background="LightGreen"