5.1 WPF路由事件以及文本样式

一、路由事件

WPF中存在一种路由事件(routed event),该事件将发送到包含该控件所在层次的所有控件,如果不希望继续向更高的方向传递,只要设置e.Handled = true即可。

这种从本控件-->父控件->父的父控件的事件,成为冒泡事件(bubbling event)。

路由方向也可以反向,比如从父控件->子控件->子控件的子控件。这种事件成为下钻事件(tunneling event),下钻事件都是使用Preview作为前缀。

举例说明:

1.1 对于一个grid中的button按钮,选择该按钮后按下某个按键(除了回车+空格外),则触发顺序为:

window_PreviewKeyDown --> Grid_PreviewKeyDown ->Button_PreviewKeyDown

->Button_KeyDown--> Grid_KeyDown--> window_KeyDown

可见PreviewKeyDown是下钻事件;而KeyDown是冒泡事件

1.2 如果增加 e.Handled = true,见下面代码,则触发顺序为:

window_PreviewKeyDown --> Grid_PreviewKeyDown,后面命令就不执行了

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)

{

MessageBox.Show("grid - previewkeydown");

e.Handled = true;

}

二、作用于按钮的样式

2.1 如果所有按钮需要同样的样式,则可以使用如下(TargetType="Button")代码:

XML 复制代码
 <Window.Resources>
      <Style TargetType="Button">
          <Setter Property="Background" Value="Red"/>
          <Setter Property="FontSize" Value="15"/>
      </Style>
  </Window.Resources>

2.2 给样式命名(x:Key),然后应用到某些控件上(Style="{StaticResource greenButtonStyle}" )

XML 复制代码
 <Window.Resources>
     <Style TargetType="Button">
         <Setter Property="Background" Value="DarkGray"/>
         <Setter Property="FontSize" Value="15"/>
     </Style>
     <Style x:Key="greenButtonStyle" TargetType="Button">
         <Setter Property="Background" Value="Green"/>
         <Setter Property="FontSize" Value="15"/>
     </Style>
 </Window.Resources>

 <Button x:Name="btnFile" Style="{StaticResource greenButtonStyle}"   />

3.使用BasedOn来利用自定义的某类控件的格式

XML 复制代码
<Window.Resources>
        <Style TargetType="Button">
            <Setter Property="Background" Value="DarkGray"/>
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontSize" Value="15"/>
            <Setter Property="Height" Value="50"/>
        </Style>
        <Style x:Key="greenButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <Setter Property="Background" Value="Green"/>     
        </Style>
        <Style x:Key="yellowButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <Setter Property="Background" Value="Yellow"/>
        </Style>
    </Window.Resources>
  1. 公共资源可以放置到:资源字典中:

这样每个窗口都可以使用这些公用的资源字典。

<ResourceDictionary>

<ResourceDictionary.MergedDictionaries>

<ResourceDictionary Source="/Style/MyButtonStyle.xaml"/>

</ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

5.对控件本身进行样式设定

XML 复制代码
<Button x:Name="btnFile"  Width="50" HorizontalAlignment="Left"  Grid.Column="0" Grid.Row="0" Margin="0,0,0,0  " Click="btnFile_Click">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Background="White" BorderThickness="4" BorderBrush="Black" CornerRadius="10" >
                <ContentPresenter Content="文件" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Border>
        </ControlTemplate>
    </Button.Template>
</Button>
相关推荐
xyphf_和派孔明2 小时前
企业级微前端项目完整创建步骤,第三步:配置 Vue 子应用
前端·javascript
自强的小白2 小时前
条件查询或查询全部时时前端请求数据等时间格式
前端
玖玥拾2 小时前
Unity 3D 笔记(十四)Unity/C# Socket 网络笔记3
服务器·网络·unity·c#
阳光是sunny3 小时前
LangGraph实战教程:一文搞懂图的状态(State)管理
前端·人工智能·后端
whyfail3 小时前
前端学 Spring Boot(5):从“你是谁”到“服务真的上线了”
前端·spring boot·后端
程序员黑豆3 小时前
鸿蒙开发:RelativeContainer相对布局组件实战——实现5个文本组件对齐
前端·华为·harmonyos
环境栈笔记3 小时前
高性价比指纹浏览器推荐与选型:如何对照价格和实际可用功能筛选候选
前端·人工智能·后端·自动化
hyf3266334 小时前
泛程序哪有想象中难!小白跟着走一遍就全懂
前端·爬虫·搜索引擎·seo·蜘蛛池
码农学院4 小时前
React公众号开发:母婴用品会员积分体系技术方案
前端·react.js·前端框架
路光.4 小时前
Vue2升级Vue3处理原 UMD/CommonJS 打包文件,不是标准 ESM
前端·javascript·vue.js·vue3