コード例 #1
0
        /// <summary>
        /// Creates editing items on the transferred panel.
        /// <para></para>
        /// Создает элементы редактирования на передаваемой панели.
        /// </summary>
        public void CreateControlsForObject(StackPanel panel)
        {
            panel.Children.Clear();
            Type objType = ObjectWithValues.GetType();

            controlsDictionary = new Dictionary <string, ControlAndInfo>();
            foreach (FieldInfo fieldInfo in objType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public))
            {
                if (typeof(IFormattable).IsAssignableFrom(fieldInfo.FieldType) || typeof(bool).IsAssignableFrom(fieldInfo.FieldType))
                {
                    Type     fieldType  = fieldInfo.FieldType;
                    object   fieldValue = fieldInfo.GetValue(ObjectWithValues);
                    GroupBox groupBox   = new GroupBox();
                    groupBox.Padding = new Thickness(5, groupBox.FontSize * 0.7 + 5, 5, 5);
                    groupBox.Header  = fieldInfo.Name;

                    ControlAndInfo         controlAndInfo = new ControlAndInfo();
                    Control                control;
                    NumericValuesAttribute atr = fieldInfo.GetCustomAttribute <NumericValuesAttribute>();

                    if (typeof(bool).IsAssignableFrom(fieldInfo.FieldType))
                    {
                        CheckBox cb = new CheckBox();
                        cb.IsChecked = Convert.ToBoolean(fieldValue);
                        control      = cb;
                    }
                    else if (atr == null)
                    {
                        control = UseTextBox(fieldValue);
                    }
                    else if (atr.WayToShow == NumericValuesWayToShow.Default)
                    {
                        control            = UseTextBox(fieldValue);
                        controlAndInfo.Min = atr.Min;
                        controlAndInfo.Max = atr.Max;
                    }
                    else if (atr.WayToShow == NumericValuesWayToShow.Slider)
                    {
                        SliderWithValueLabel swl = new SliderWithValueLabel();
                        swl.slider.Minimum = atr.Min;
                        swl.slider.Maximum = atr.Max;
                        swl.slider.Value   = Convert.ToDouble(fieldValue);
                        control            = swl;
                    }
                    else
                    {
                        throw new Exception("Don`t know how to show field " + fieldInfo.Name + ".");
                    }
                    //////
                    //content.Margin = new Thickness(5, 0, 5, 0);
                    controlAndInfo.Control = control;
                    controlsDictionary.Add(fieldInfo.Name, controlAndInfo);
                    groupBox.Content = control;
                    panel.Children.Add(groupBox);
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// This function try to convert ControlAndInfo values. If the type of error when converting will be ParsebleException, function throws it.
        /// All other errors are processed and return an error message via errorMessage.
        /// <para></para>
        /// Эта функция пытается конвертировать значения ControlAndInfo. Если тип ошибки при конвертировании будет ParsebleException, то она выкинет ее.
        /// Все остальные ошибки обработаются и вернут сообщени об ошибке через errorMessage.
        /// </summary>
        object TryToConvert(out string errorMessage, ControlAndInfo controlAndInfo, FieldInfo fieldInfo)
        {
            //Shit-code, i know. But it`s only way i find to make it work.
            Type   fieldType    = fieldInfo.FieldType;
            object controlValue = null;
            string errMsg       = "";

            try
            {
                controlValue = GetValueFromControl(controlAndInfo.Control, fieldType);
                if (controlValue == null)
                {
                    throw new Exception();
                }
            }
            catch (Exception ex)
            {
                if (typeof(ParsebleException).IsAssignableFrom(ex.GetType()))
                {
                    throw;
                }
                else
                {
                    errMsg += string.Format(LanguageHandler.GetInstance().IncorrectValueMsg, fieldInfo.Name, fieldType.Name);
                }
            }
            double min = controlAndInfo.Min, max = controlAndInfo.Max;

            try
            {
                if (min < max)
                {
                    double value = Convert.ToDouble(GetValueFromControl(controlAndInfo.Control));
                    if (!(value >= min && value <= max))
                    {
                        throw new Exception();
                    }
                }
            }
            catch
            {
                errMsg += string.Format(LanguageHandler.GetInstance().IncorrectRangeMsg, fieldInfo.Name, min, max);
            }
            errorMessage = errMsg;
            return(controlValue);
        }