如何在既定皮肤下为某个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添加了“个性”。