有没有比这"cleaner"方法可以设置一组控件的属性?



正在学习清理此代码的方法。有什么方法可以应用c#中定义的"样式"吗?我是新手,正在寻找加强编程的方法。我希望能够以更简洁的方式定义每个滑块的边距、最大值、方向、步长、刻度频率、刻度位置和过渡。

        //Slider 1
        Slider Slider_1 = new Slider();
        Slider_1.SetValue(Grid.ColumnProperty, 0);
        Slider_1.Margin = new Thickness(30, 12, 0, 0);
        Slider_1.Orientation = Orientation.Vertical;
        Slider_1.Maximum = 10;
        Slider_1.StepFrequency = 0.25;
        Slider_1.TickFrequency = 0.25;
        Slider_1.TickPlacement = TickPlacement.Outside;
        Slider_1.Transitions = new TransitionCollection();
        Slider_1.Transitions.Add(new EntranceThemeTransition() { });
        //Slider 2
        Slider Slider_2 = new Slider();
        Slider_2.SetValue(Grid.ColumnProperty, 1);
        Slider_2.Margin = new Thickness(30, 12, 0, 0);
        Slider_2.Orientation = Orientation.Vertical;
        Slider_2.Maximum = 10;
        Slider_2.StepFrequency = 0.25;
        Slider_2.TickFrequency = 0.25;
        Slider_2.TickPlacement = TickPlacement.Outside;
        Slider_2.Transitions = new TransitionCollection();
        Slider_2.Transitions.Add(new EntranceThemeTransition() { });
        //Slider 3
        Slider Slider_3 = new Slider();
        Slider_3.SetValue(Grid.ColumnProperty, 2);
        Slider_3.Margin = new Thickness(30, 12, 0, 0);
        Slider_3.Orientation = Orientation.Vertical;
        Slider_3.Maximum = 10;
        Slider_3.StepFrequency = 0.25;
        Slider_3.TickFrequency = 0.25;
        Slider_3.TickPlacement = TickPlacement.Outside;
        Slider_3.Transitions = new TransitionCollection();
        Slider_3.Transitions.Add(new EntranceThemeTransition() { });
        //Slider 4
        Slider Slider_4 = new Slider();
        Slider_4.SetValue(Grid.ColumnProperty, 3);
        Slider_4.Margin = new Thickness(30, 12, 0, 0);
        Slider_4.Orientation = Orientation.Vertical;
        Slider_4.Maximum = 10;
        Slider_4.StepFrequency = 0.25;
        Slider_4.TickFrequency = 0.25;
        Slider_4.TickPlacement = TickPlacement.Outside;
        Slider_4.Transitions = new TransitionCollection();
        Slider_4.Transitions.Add(new EntranceThemeTransition() { });
Slider Slider_1 = new Slider(); 
SetProperties(Slider_1,.....)

public void SetProperties(Slider slider,some other parameters)
{
    slider.SetValue(Grid.ColumnProperty, 0);
    slider.Margin = new Thickness(30, 12, 0, 0);
    slider.Orientation = Orientation.Vertical;
    slider.Maximum = 10;
    slider.StepFrequency = 0.25;
    slider.TickFrequency = 0.25;
    slider.TickPlacement = TickPlacement.Outside;
    slider.Transitions = new TransitionCollection();
    slider.Transitions.Add(new EntranceThemeTransition() { });
}

如果所有属性都具有完全相同的值,则可以构建一个创建Slider对象的函数。。类似的东西

private Slider GetSlider()
{
    var slider = new Slider() {            
        Margin = new Thickness(30, 12, 0, 0),
        Orientation = Orientation.Vertical,
        Maximum = 10,
        StepFrequency = 0.25,
        TickFrequency = 0.25,
        TickPlacement = TickPlacement.Outside,
        Transitions = new TransitionCollection()            
    };
    slider.SetValue(Grid.ColumnProperty, 1);
    slider.Transitions.Add(new EntranceThemeTransition() { });
    return slider;
}

使用Factory方法创建Slider对象,同时传递所有需要的属性。

您可以执行一个方法,接收滑块并设置参数传递的属性

private Slider CreateSlider(int columnProperty, Thickness thickness, short orientation
    int maximum, double stepFrequency, double  tickFrequency, short tickPlacement )
{ Slider slider = new slider
  slider.SetValue(Grid.ColumnProperty, columnProperty);
  slider.Margin = thickness;
  slider.Orientation = orientation;
  slider.Maximum = maximum;
  slider.StepFrequency = stepFrequency;
  slider.TickFrequency = tickFrequency;
  slider.TickPlacement =tickPlacement 
  slider.Transitions = new TransitionCollection();
  slider.Transitions.Add(new EntranceThemeTransition() { });
return slider
}

并使用它传递值

Slider slider_1 = CreateSlider(0, new Thickness(30, 12, 0, 0), (short)Orientation.Vertical, 
        10, 0.25, 0.25,  (short)TickPlacement.Outside )

我假设一些值的types(例如在enums中),您应该将正确的types

根据您需要在哪里创建这些滑块,工厂模式的实现在这里是合适的。这将为您提供一种轻松封装和重用用于创建Slider实例的逻辑的方法。如果以后需要一种不同的"样式",它也可以扩展为具有多种创建方法

示例

var sliderFactory = new SliderFactory();
var Slider_1 = sliderFactory.CreateSlider();
var Slider_2 = sliderFactory.CreateSlider(SliderStyle.AnotherSliderStyle);

重构,重构,重构。这些都可以提取到一个方法中。参数将是丑陋的罪恶,但它会做的工作。

或者,使用工厂模式,但这可能有些过头了。

工厂模式

系统设计的一个重要方面是创建对象的方式。尽管考虑对象模型和实例交互通常需要花费更多的时间,但如果忽略这个简单的设计方面,将对整个系统产生不利影响。因此,一个对象做什么或建模不仅很重要,而且它是以什么方式创建的。

由于大多数面向对象的语言和运行时都提供对象实例化(例如new、newobj等)和初始化(例如构造函数)机制,因此可能存在直接使用这些工具而不预先考虑未来后果的趋势。这种功能的过度使用通常会在系统中引入大量的灵活性,因为直接使用语言/运行时对象实例化函数会在创建者和创建的类之间创建显式的关联。虽然关联是面向对象系统中一种必要的关系类型,但如果需求发生变化,类之间引入的耦合是非常难以克服的(就像它们总是做的那样)。

由于需要减少与实例创建跨系统,同样的情况并不少见在各种不同的应用中使用的解决方案的类型和框架。在设计模式中形式化:可重用面向对象软件(Addison-Wesley Publishing Company,1995),这些解决方案被称为创造性模式。创造性的模式描述对象创建机制,使不断发展的系统中的重用级别。

最广泛使用的创造模式之一是工厂。这模式的名称很恰当,因为它要求使用专门的对象来创建其他对象,很像真实世界中的工厂。在以下部分中,我们将检查逻辑和物理这个模式的模型,以及讨论这个的一个这样的使用NET Framework中的模式。

http://msdn.microsoft.com/en-us/library/ee817667.aspx

使用列表,使用对象初始化,使用具有默认和命名参数的方法。

var sliderList = new List<Slider>() {
   CreateDefaultSlider(),
   CreateDefaultSlider(),
   CreateDefaultSlider(gridCol = 3), //example of customizatiom
};
public Slider CreateDefaultSlider(int gridCol = 0, int max = 10, float stepFreq = 0.25, float tickFreq = 0.25, int tX1 = 30, int tY1 = 12, int tX1 = 0, int tY2 = 0) {
   var slider = new Slider {
      Margin = new Thickness(tX1, tY1, tX2, tY2),
      Orientation = Orientatian.Vertical, //not sure these work with default params
      Maximum = max,
      StepFrequency = stepFreq,
      TickFrequency = tickFreq,
      TickPlacement = TickPlacement.Outside,
      Transitions = new TransitionCollection()
  };
   slider.SetValue(Grid.ColumnProperty, gridCol);
   slider.Transitions.Add(new EntranceThemeTransition());
   return slider;
}

我还没有尝试过这段代码,但你可以尝试for。。。每个循环。抱歉Vb,但是。。。

   For Each slider as Slider in Controls
            slider.SetValue(Grid.ColumnProperty, 0);
            slider.Margin = new Thickness(30, 12, 0, 0);
            slider.Orientation = Orientation.Vertical;
            slider.Maximum = 10;
            slider.StepFrequency = 0.25;
            slider.TickFrequency = 0.25;
            slider.TickPlacement = TickPlacement.Outside;
            slider.Transitions = new TransitionCollection();
            slider.Transitions.Add(new EntranceThemeTransition() { });
    Next

至少您只需要设置属性一次

最新更新