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添加了“个性”。 

  • 相关阅读:
    随笔2
    随笔
    关于updateElement接口
    随笔1
    本地访问正常,服务器访问乱码 记录
    Redis (error) NOAUTH Authentication required.解决方法
    tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
    微信公众号消息回复
    微信公众号 报token验证失败
    idea中web.xml报错 Servlet should have a mapping
  • 原文地址:https://www.cnblogs.com/sjqq/p/7797381.html
Copyright © 2011-2022 走看看