C# 是否有一个“问题”;“清洁剂”;如何设置一组控件的属性?

C# 是否有一个“问题”;“清洁剂”;如何设置一组控件的属性?,c#,C#,希望了解清理此代码的方法。有没有办法在c#中应用定义的“样式”?我是新来的,正在寻找加强编程的方法。我希望能够以更简洁的方式定义每个滑块的边距、最大值、方向、步长频率、刻度频率、刻度位置和过渡 //Slider 1 Slider Slider_1 = new Slider(); Slider_1.SetValue(Grid.ColumnProperty, 0); Slider_1.Margin = new Thickness(30,

希望了解清理此代码的方法。有没有办法在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() { });

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

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 )

我假设一些
类型
的值(例如在
枚举
中),您应该放置正确的
类型

如果所有属性都具有完全相同的值,您可以构建一个创建滑块对象的函数。。差不多

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() { });
}
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方法创建一次传递所有所需属性的滑块对象。

根据需要在何处创建这些滑块,此处将适合使用的实现。这将为您提供一种轻松封装和重用逻辑的方法,用于创建
滑块的实例。如果以后需要一种你称之为不同的“风格”,它也可以扩展为有多种创建方法

范例

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

重构,重构,重构。这一切都可以提取到一个方法中。这些参数会像sin一样难看,但它会起作用

或者,使用工厂模式,但这可能有点过分

工厂模式

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

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

由于需要减少与以下各项相关的固有耦合: 实例创建跨越多个系统,看到同样的情况并不少见 各种不同应用中使用的解决方案类型 和框架。设计模式中的形式化:元素 可重用面向对象软件(Addison Wesley Publishing Company, 1995),这些解决方案被称为创造模式。创造性的 模式描述的对象创建机制支持更大的 不断发展的系统中的重用级别

最广泛使用的创作模式之一是工厂。这 模式被恰当地命名,因为它需要使用专门的 对象来创建其他对象,就像真实世界的工厂一样。 在以下部分中,我们将检查逻辑和物理 这种模式的模型,以及讨论这种模式的一种用法 NET框架中的模式


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

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;
}
var sliderList=新列表(){
CreateDefaultSlider(),
CreateDefaultSlider(),
CreateDefaultSlider(gridCol=3),//自定义对象的示例
};
公共滑块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){
变量滑块=新滑块{
余量=新厚度(tX1,tY1,tX2,tY2),
Orientation=orientian.Vertical,//不确定这些参数是否适用于默认参数
最大值=最大值,
步进频率=步进频率,
滴答声频率=滴答声频率,
TickPlacement=TickPlacement.外部,
Transitions=新TransitionCollection()
};
slider.SetValue(Grid.ColumnProperty,gridCol);
slider.Transitions.Add(新入口ThemeTransition());
返回滑块;
}

我还没有尝试过这段代码,但您可以尝试为每个循环使用一个for。很抱歉,但是

   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

至少只需设置一次属性

您听说过数组吗?你必须有,你正在代码中使用它们。这是WPF吗?或者你只是在征求一般的C#建议?如果是WPF,你可以使用样式。@codekaizen我需要以编程方式添加控件。xaml中不使用样式吗?不必使用。样式只是生成您在此处描述的确切内容的一种方式。甚至可以通过编程方式构建样式,然后通过编程方式将其应用于一组控件。但是看起来您有一个静态样式,您可以声明它,然后使用样式选择器应用它。使用.NET4的默认参数怎么样?我喜欢。但是为什么不让方法成为静态的呢?让这个方法成为静态的没有问题,但是我只喜欢“util”类的静态方法。这个方法是特定于类的(我认为),我想这是一个品味问题,因为它和实例方法一样好用。我只是认为,当方法声明为静态时,更容易“看到”该方法不使用当前对象的任何“状态”。