zoukankan      html  css  js  c++  java
  • wpf Style也继承(包含内部定义事件)

    如何在既定皮肤下为某个style添加内容是我今天碰的问题,皮肤往往是对全局control进行设置的,当然这就无法满足某个个性十足的“另类”了,比如当使用DataGridCheckBoxColumn时,需要给DataGridCell中check添加Checked事件,或者给DataGridTextColumn的Textbox添加TextChanged事件等,那么如何满足这个另类呢?对于此需求我认为最直接简单的办法就是在DataGridCell中下工夫,即对DataGridCell的Style进行编写如下几行:

     

    <DataGridCheckBoxColumn.CellStyle>

                      <Style>

                              <EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>

                   </Style>

      </DataGridCheckBoxColumn.CellStyle>


    对于DataGridTextColumn的textchanged事件根据以上内容再对应的位置进行更改即可。

    但是把此段代码放到何处?直接放到皮肤文件中是不行的,因为一旦放入到皮肤中,每个引用此皮肤的control中都应该有OnChecked事件的定义,如果没有则编译报错!既然皮肤中不行那就只能在“本地”修改了,那么再本地定义的style需不需要重新定义那些那皮肤中已定义的内容?为了更好的“配合”,我们应该像“继承”一样,完全继承皮肤中的东西,然后再添加“个性”的东西,style类的功能就是如此的强大,对于以上需求 我们只做些许改动即可:

    <DataGridCheckBoxColumn x:Name="dgtemprepeated"   Binding="{Binding Path=IsRepeated, Mode=TwoWay}"                                                                                                                                                                                                                                                                      <DataGridCheckBoxColumn.CellStyle>

                             <Style BasedOn="皮肤中对应该control的Style名称">

                                                           <EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>

                              </Style>

            </DataGridCheckBoxColumn.CellStyle>

    </DataGridCheckBoxColumn>

     

    也可以在后台添加

    [csharp] view plain copy
     
    1. Style checkstyle = new Style();  
    2.        /*这里不能使用checkstyle=dgtemprepeated.CellStyle然后在此style中添加setters中添加setter, 
    3.        当然这种方法在编译时是不报错的,但当运行时就会出错,因为查阅文件指出: 
    4.        只能在该style被第一次使用之前修改.也就是说一旦它被使用就不能再修改, 
    5.        所以当不能确定它何时被第一次使用时,还是小心为妙。*/  
    6.         checkstyle.BasedOn = dgtemprepeated.CellStyle;  
    7.         //在cellStyle的Get方法中,将TargetType中的很多信息清空了,比如“Name”属性等,所以要在这里重新给TargetType赋值          
    8.         checkstyle.TargetType = dgtemprepeated.CellStyle.TargetType;  
    9.         //此处构造方法中RoutedEventHandler为dgTempCheckBox_Click事件的路由处理器,当然对于不同的事件采用不用的处理器    
    10.        EventSetter eventsetter = new EventSetter(CheckBox.CheckedEvent, new RoutedEventHandler(dgTempCheckBox_Click));  
    11.        checkstyle.Setters.Add(eventsetter);     
    12.        dgtemprepeated.CellStyle = checkstyle;  


     

    这样就简单快捷的为某个control添加了“个性”。 

  • 相关阅读:
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:在 <tbody> 内的任一行启用鼠标悬停状态
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:为所有表格的单元格添加边框
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:在 <tbody> 内添加斑马线形式的条纹 ( IE8 不支持)
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:为任意 <table> 添加基本样式 (只有横向分隔线)
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:同一行代码片段: span, div
    吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:电脑程序输出: Sample output
    【codeforces 796A】Buying A House
    【codeforces 796B】Find The Bone
    【codeforces 796D】Police Stations
    【[Offer收割]编程练习赛13 C】 一人麻将
  • 原文地址:https://www.cnblogs.com/sjqq/p/7797381.html
Copyright © 2011-2022 走看看