如何在既定皮肤下为某个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>
也可以在后台添加
- Style checkstyle = new Style();
- /*这里不能使用checkstyle=dgtemprepeated.CellStyle然后在此style中添加setters中添加setter,
- 当然这种方法在编译时是不报错的,但当运行时就会出错,因为查阅文件指出:
- 只能在该style被第一次使用之前修改.也就是说一旦它被使用就不能再修改,
- 所以当不能确定它何时被第一次使用时,还是小心为妙。*/
- checkstyle.BasedOn = dgtemprepeated.CellStyle;
- //在cellStyle的Get方法中,将TargetType中的很多信息清空了,比如“Name”属性等,所以要在这里重新给TargetType赋值
- checkstyle.TargetType = dgtemprepeated.CellStyle.TargetType;
- //此处构造方法中RoutedEventHandler为dgTempCheckBox_Click事件的路由处理器,当然对于不同的事件采用不用的处理器
- EventSetter eventsetter = new EventSetter(CheckBox.CheckedEvent, new RoutedEventHandler(dgTempCheckBox_Click));
- checkstyle.Setters.Add(eventsetter);
- dgtemprepeated.CellStyle = checkstyle;
这样就简单快捷的为某个control添加了“个性”。