예제 #1
0
        public void AddCustomMemberDescriptor(ICustomMemberDescriptor descriptor)
        {
            if (descriptor == null)
            {
                throw new ArgumentNullException(nameof(descriptor));
            }
            var propItem = new PropertyItem {
                PropertyName = descriptor.DisplayName
            };

            var memberInfos = descriptor.GetMemberInfos();

            if (memberInfos == null)
            {
                LoggerService.WriteCallerLine($"{nameof(memberInfos)} can't be null.");
                return;
            }

            _vm.Items.Add(propItem);
            ThreadInvokerExtensions.AddBufferItemsToCollection(
                propItem.Items,
                memberInfos,
                memberInfo => {
                var infoPropItem = new PropertyItem {
                    PropertyName = memberInfo.DisplayName, Value = memberInfo.Value?.ToString()
                };
                infoPropItem.SetInstance <IMemberInfo>(memberInfo, Constants.PropertyItemTag_MemberInfo);
                return(infoPropItem);
            },
                sleepInterval: 100
                );


            //_vm.Item.CompositeCustomMemberDecriptor(descriptor);
        }
 public void CompositeCustomMemberDecriptor(ICustomMemberDescriptor descriptor)
 {
     _customMemberDescriptors.Add(descriptor);
 }
예제 #3
0
        /// <summary>
        /// 高亮结构体背景与ToolTip,PropertyGrid;
        /// </summary>
        /// <param name="hexDataContext"></param>
        /// <param name="offset">绝对偏移量</param>
        /// <param name="originBrush">默认颜色</param>
        /// <param name="fieldPrefix">字段高亮前缀值(语言相关)</param>
        /// <param name="highlightBrush">高亮颜色</param>
        /// <param name="languageKeyPrefix">语言前缀类型</param>
        public static void LoadCustomTypeDescriptor(
            this IHexDataContext hexDataContext,
            ICustomMemberDescriptor customMemberDescriptor,
            long offset,
            Brush originBrush,
            Brush highlightBrush
            )
        {
            var memberInfos = customMemberDescriptor.GetMemberInfos();

            var fieldOffset = 0;
            var toolTipAndBrushBlockTuples = new List <(IToolTipDataItem dataItem, IBrushBlock brushBlock, IMemberInfo memberInfo)?>();

            foreach (var memberInfo in memberInfos)
            {
                var dataItem   = ToolTipItemFactory.CreateIToolTipDataItem();
                var brushBlock = BrushBlockFactory.CreateNewBackgroundBlock();

                dataItem.KeyName = memberInfo.DisplayName + $"({memberInfo.MemberSize})";

                dataItem.Value = memberInfo.Value?.ToString();

                brushBlock.Background  = originBrush;
                brushBlock.StartOffset = offset + fieldOffset;
                brushBlock.Length      = memberInfo.MemberSize;

                toolTipAndBrushBlockTuples.Add((dataItem, brushBlock, memberInfo));
                fieldOffset += memberInfo.MemberSize;
            }

            toolTipAndBrushBlockTuples.ForEach(p => {
                hexDataContext.CustomBackgroundBlocks.Add(p.Value.brushBlock);
                hexDataContext.CustomDataToolTipItems.Add((offset, fieldOffset, p.Value.dataItem));
            });

            //ToolTip悬停高亮;
            hexDataContext.SelectedToolTipItemChanged += delegate {
                if (hexDataContext.SelectedToolTipItem == null)
                {
                    return;
                }
                toolTipAndBrushBlockTuples.ForEach(p => {
                    p.Value.brushBlock.Background = originBrush;
                });
                var slTuple = toolTipAndBrushBlockTuples.FirstOrDefault(p => p.Value.dataItem == hexDataContext.SelectedToolTipItem);
                if (slTuple == null)
                {
                    return;
                }
                slTuple.Value.brushBlock.Background = highlightBrush;
                hexDataContext.UpdateCustomBackgroundBlocks();
            };

            //PropertyGrid部分;
            var(instance, isNew) = hexDataContext.GetOrCreateInstanceInform(Constants.HexDataContextTag_PropertyListDataContext, PropertyGridDataContextFactory.CreateNew);
            var propertyListDataContext = instance;

            if (propertyListDataContext == null)
            {
                return;
            }
            //若为首次创建,则加入视图;
            if (isNew)
            {
                hexDataContext.StackGrid.AddChild(propertyListDataContext, new Contracts.Controls.GridChildLength(new System.Windows.GridLength(1, System.Windows.GridUnitType.Star)), 1);
            }
            propertyListDataContext.AddCustomMemberDescriptor(customMemberDescriptor);


            //PropertyGrid选中属性高亮;
            propertyListDataContext.SelectedMemberInfoChanged += delegate {
                if (propertyListDataContext.SelectedMemberInfo == null)
                {
                    return;
                }
                toolTipAndBrushBlockTuples.ForEach(p => {
                    p.Value.brushBlock.Background = originBrush;
                });
                var slTuple = toolTipAndBrushBlockTuples.FirstOrDefault(p => p.Value.memberInfo == propertyListDataContext.SelectedMemberInfo);
                if (slTuple == null)
                {
                    return;
                }

                slTuple.Value.brushBlock.Background = highlightBrush;
                if (hexDataContext.BytePerLine != 0)
                {
                    hexDataContext.Position = slTuple.Value.brushBlock.StartOffset / hexDataContext.BytePerLine * hexDataContext.BytePerLine;
                }
                hexDataContext.UpdateCustomBackgroundBlocks();
            };
        }