Ejemplo n.º 1
0
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var dts = new DataTemplates();

            if (!(item is ImageAction ia))
            {
                return(null);
            }

            if (ia.IsEditMode)
            {
                var defaultDt = (dts.FindResource("default") as DataTemplate);
                FrameworkElementFactory factory = new FrameworkElementFactory(typeof(ContentPresenter));
                factory.SetValue(ContentPresenter.ContentTemplateProperty, defaultDt);
                var conv      = new BooleanToVisibilityConverter();
                var mainPanel = new FrameworkElementFactory(typeof(StackPanel));
                mainPanel.AppendChild(factory);
                var sp = new FrameworkElementFactory(typeof(StackPanel));
                sp.SetBinding(StackPanel.VisibilityProperty, new Binding("IsEditMode")
                {
                    Converter = conv
                });

                foreach (var prop in ia.GetType().GetProperties())
                {
                    object[] attrs = prop.GetCustomAttributes(true);
                    if (attrs == null || attrs.Length == 0)
                    {
                        continue;
                    }

                    foreach (Attribute attr in attrs)
                    {
                        if (attr is LabelAttribute)
                        {
                            var label = GenerateLabel(prop);
                            sp.AppendChild(GenerateLabel(prop));
                            label.SetBinding(TextBlock.TextProperty, new Binding(prop.Name));
                            sp.AppendChild(label);
                            sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                        }

                        if (attr is CheckBoxAttribute)
                        {
                            var checkbox = new FrameworkElementFactory(typeof(CheckBox));
                            checkbox.SetValue(CheckBox.ContentProperty, prop.Name);
                            checkbox.SetValue(CheckBox.MarginProperty, new Thickness(5));
                            checkbox.SetBinding(CheckBox.IsCheckedProperty, new Binding(prop.Name));
                            sp.AppendChild(checkbox);
                            sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                        }

                        if (attr is SliderAttribute)
                        {
                            sp.AppendChild(GenerateLabel(prop));
                            var sl     = attr as SliderAttribute;
                            var slider = new FrameworkElementFactory(typeof(Slider));
                            slider.SetValue(Slider.MaximumProperty, sl.MaxVal);
                            slider.SetValue(Slider.MinimumProperty, sl.MinVal);
                            if (sl.IsIntegerType)
                            {
                                slider.SetValue(Slider.IsSnapToTickEnabledProperty, true);
                                slider.SetValue(Slider.TickFrequencyProperty, sl.Increment);
                                slider.SetValue(Slider.SmallChangeProperty, sl.Increment);
                            }

                            slider.SetValue(Slider.HorizontalAlignmentProperty, HorizontalAlignment.Stretch);
                            slider.SetValue(Slider.MarginProperty, new Thickness(5));
                            slider.SetBinding(Slider.ValueProperty, new Binding(prop.Name));

                            var tb = new FrameworkElementFactory(typeof(TextBlock));
                            tb.SetValue(TextBlock.PaddingProperty, new Thickness(5));
                            tb.SetBinding(TextBlock.TextProperty, new Binding(prop.Name)
                            {
                                StringFormat = sl.IsIntegerType ? "N1" : "N2"
                            });
                            sp.AppendChild(tb);
                            sp.AppendChild(slider);
                            sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                        }

                        if (attr is EnumAttribute)
                        {
                            sp.AppendChild(GenerateLabel(prop));
                            var en    = attr as EnumAttribute;
                            var combo = new FrameworkElementFactory(typeof(ComboBox));

                            combo.SetValue(ComboBox.ItemsSourceProperty, Enum.GetValues(en.EnumClass));

                            combo.SetValue(ComboBox.SelectedItemProperty, new Binding(prop.Name));

                            sp.AppendChild(combo);
                            sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                        }

                        if (attr is TextBoxAttribute)
                        {
                            sp.AppendChild(GenerateLabel(prop));
                            var en  = attr as EnumAttribute;
                            var txt = new FrameworkElementFactory(typeof(TextBox));

                            txt.SetValue(TextBox.TextProperty, new Binding(prop.Name)
                            {
                                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
                            });

                            sp.AppendChild(txt);
                            sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                        }

                        if (attr is RGBColorAttribute)
                        {
                            sp.AppendChild(GenerateLabel(prop));
                            var rgb = attr as RGBColorAttribute;
                            var cp  = new FrameworkElementFactory(typeof(ColorCanvas));
                            cp.SetBinding(ColorCanvas.SelectedColorProperty, new Binding(prop.Name));
                            cp.SetValue(ColorCanvas.UsingAlphaChannelProperty, false);
                            sp.AppendChild(cp);
                            sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                        }
                    }
                }

                mainPanel.AppendChild(sp);
                return(new DataTemplate()
                {
                    VisualTree = mainPanel
                });
            }
            //Non edit mode
            return(dts.FindResource("default") as DataTemplate);
        }
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            var dts = new DataTemplates();
            if (item is ImageAction)
            {
                var ia = item as ImageAction;
                if (ia.IsEditMode)
                {
                    var defaultDt = (dts.FindResource("default") as DataTemplate);
                    FrameworkElementFactory factory = new FrameworkElementFactory(typeof(ContentPresenter));
                    factory.SetValue(ContentPresenter.ContentTemplateProperty, defaultDt);
                    var conv = new BooleanToVisibilityConverter();
                    var mainPanel = new FrameworkElementFactory(typeof(StackPanel));
                    mainPanel.AppendChild(factory);
                    var sp = new FrameworkElementFactory(typeof(StackPanel));
                    sp.SetBinding(StackPanel.VisibilityProperty, new Binding("IsEditMode") { Converter = conv });

                    foreach (var prop in ia.GetType().GetProperties())
                    {
                        object[] attrs = prop.GetCustomAttributes(true);
                        if (attrs == null || attrs.Length == 0)
                            continue;

                        foreach (Attribute attr in attrs)
                        {
                            if (attr is SliderAttribute)
                            {
                                sp.AppendChild(GenerateLabel(prop));
                                var sl = attr as SliderAttribute;
                                var slider = new FrameworkElementFactory(typeof(Slider));
                                slider.SetValue(Slider.MaximumProperty, sl.MaxVal);
                                slider.SetValue(Slider.MinimumProperty, sl.MinVal);
                                if (sl.IsIntegerType)
                                {
                                    slider.SetValue(Slider.IsSnapToTickEnabledProperty, true);
                                    slider.SetValue(Slider.TickFrequencyProperty, sl.Increment);
                                    slider.SetValue(Slider.SmallChangeProperty, sl.Increment);
                                }

                                slider.SetValue(Slider.HorizontalAlignmentProperty, HorizontalAlignment.Stretch);
                                slider.SetValue(Slider.MarginProperty, new Thickness(5));
                                slider.SetBinding(Slider.ValueProperty, new Binding(prop.Name));

                                var tb = new FrameworkElementFactory(typeof(TextBlock));
                                tb.SetValue(TextBlock.PaddingProperty, new Thickness(5));
                                tb.SetBinding(TextBlock.TextProperty, new Binding(prop.Name) { StringFormat = sl.IsIntegerType ? "N1" : "N2" });
                                sp.AppendChild(tb);
                                sp.AppendChild(slider);
                                sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                            }

                            if (attr is EnumAttribute)
                            {
                                sp.AppendChild(GenerateLabel(prop));
                                var en = attr as EnumAttribute;
                                var combo = new FrameworkElementFactory(typeof(ComboBox));

                                combo.SetValue(ComboBox.ItemsSourceProperty, Enum.GetValues(en.EnumClass));

                                combo.SetValue(ComboBox.SelectedItemProperty, new Binding(prop.Name));

                                sp.AppendChild(combo);
                                sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                            }

                            if (attr is RGBColorAttribute)
                            {
                                sp.AppendChild(GenerateLabel(prop));
                                var rgb = attr as RGBColorAttribute;
                                var cp = new FrameworkElementFactory(typeof(ColorCanvas));
                                cp.SetBinding(ColorCanvas.SelectedColorProperty, new Binding(prop.Name));
                                cp.SetValue(ColorCanvas.UsingAlphaChannelProperty, false);
                                sp.AppendChild(cp);
                                sp.AppendChild(new FrameworkElementFactory(typeof(Separator)));
                            }
                        }
                    }

                    //var dp = new FrameworkElementFactory(typeof(DockPanel));
                    //var applyBt = new FrameworkElementFactory(typeof(Button));
                    //applyBt.SetBinding(Button.IsEnabledProperty, new Binding("HasChanged") { Mode = BindingMode.TwoWay });
                    //applyBt.SetValue(DockPanel.DockProperty, Dock.Right);
                    //applyBt.SetValue(Button.PaddingProperty, new Thickness(5));
                    //applyBt.SetBinding(Button.CommandProperty, new Binding("ApplyCommand")
                    //{
                    //    ElementName = "current",
                    //    Path = new PropertyPath("DataContext.ApplyCommand")
                    //});
                    //applyBt.SetBinding(Button.CommandParameterProperty, new Binding());
                    //applyBt.SetValue(Button.ContentProperty, "Apply Changes");
                    //dp.AppendChild(applyBt);
                    //sp.AppendChild(dp);

                    mainPanel.AppendChild(sp);
                    return new DataTemplate() { VisualTree = mainPanel };
                }
                //Non edit mode
                return dts.FindResource("default") as DataTemplate;
            }
            return null;
        }