namespace ExtendedControlsLibrary.Skinning.CustomPropertyGrid { // See the DevExpress suport question: // https://www.devexpress.com/Support/Center/Question/Details/Q539013 using System.ComponentModel; using System.Drawing; using DevExpress.Utils; using DevExpress.XtraVerticalGrid; using DevExpress.XtraVerticalGrid.Events; using DevExpress.XtraVerticalGrid.Rows; using DevExpress.XtraVerticalGrid.ViewInfo; public class MyPropertyGridControl : PropertyGridControl { private bool _wantAlternatingRows; private bool _eventConnected; private AppearanceObject _alternatingRowStyle; private AppearanceObject _normalRowStyle; [DefaultValue(false)] public bool WantAlternatingRows { get { return _wantAlternatingRows; } set { _wantAlternatingRows = value; checkConnectEvent(); } } private void checkConnectEvent() { if (!_eventConnected) { _eventConnected = true; _alternatingRowStyle = new AppearanceObject { BackColor = SkinHelper.AlternatingGridRowColors }; CustomDrawRowHeaderCell += MyPropertyGridControl_CustomDrawRowHeaderCell; CustomDrawRowValueCell += MyPropertyGridControl_CustomDrawRowValueCell; CustomDrawRowHeaderIndent += MyPropertyGridControl_CustomDrawRowHeaderIndent; CustomDrawTreeButton += MyPropertyGridControl_CustomDrawTreeButton; } } private void MyPropertyGridControl_CustomDrawTreeButton(object sender, CustomDrawTreeButtonEventArgs e) { applyDrawing(e); } private void MyPropertyGridControl_CustomDrawRowHeaderIndent( object sender, CustomDrawRowHeaderIndentEventArgs e) { if (applyDrawing(e)) { if (e.Row.VisibleIndex%2 == 0) { foreach (IndentInfo info in e.RowIndents) { info.Style.Combine(_alternatingRowStyle); } } else { foreach (IndentInfo info in e.RowIndents) { info.Style.Combine(checkGetNormalRowStyle(e.Row)); } } } } private void MyPropertyGridControl_CustomDrawRowHeaderCell( object sender, CustomDrawRowHeaderCellEventArgs e) { applyDrawing(e); } private void MyPropertyGridControl_CustomDrawRowValueCell( object sender, CustomDrawRowValueCellEventArgs e) { applyDrawing(e); } private bool applyDrawing(CustomDrawRowEventArgs e) { if (WantAlternatingRows && !(e.Row is CategoryRow) && FocusedRow != e.Row) { if (e.Row.VisibleIndex%2 == 0) { e.Appearance.Combine(_alternatingRowStyle); } else { e.Appearance.Combine(checkGetNormalRowStyle(e.Row)); } return true; } else { return false; } } private AppearanceObject checkGetNormalRowStyle(BaseRow row) { return _normalRowStyle ?? (_normalRowStyle = new AppearanceObject { BackColor = row.Appearance.BackColor == Color.Empty ? SystemColors.Window : row.Appearance.BackColor }); } } }