2013-09-22 93 views
5

Tôi có một điều khiển tab có 3 trang tab. Bên dưới tab này kiểm soát trên cùng một hình thức/xem, tôi có 3 điều khiển hình ảnh.Làm thế nào để tôi loại bỏ câu lệnh Switch?

Dựa trên SelectedIndex của tab, tôi cần thay đổi độ mờ của dưới 3 hình ảnh.

Tính đến bây giờ tôi có một cái gì đó như thế này trong SelectionChanged sự kiện của Tab kiểm soát:

switch (Tab.SelectedIndex) 
{ 
    case 0: 
     img1.Opacity= 1; 
     img2.Opacity = 0.5; 
     img3.Opacity = 0.5; 
     break; 
    case 1: 
     img1.Opacity = 0.5; 
     img2.Opacity = 1; 
     img3.Opacity = 0.5; 
     break; 
    case 2: 
     img1.Opacity = 0.5; 
     img2.Opacity = 0.5; 
     img3.Opacity = 1; 
     break; 
} 

Làm thế nào để tôi loại bỏ lệnh switch này? Tôi sẽ sử dụng mẫu thiết kế nào ở đây?

+0

Tại sao xóa/thay thế công tắc? Điều gì không hoạt động? –

+0

Nó không phải là đơn vị thử nghiệm. – NoobDeveloper

+2

Vâng. Sự kiện xung quanh sự kiện có thể là một vấn đề, nhưng điều đó đòi hỏi một sửa chữa lớn hơn. –

Trả lời

1

Bạn có thể sử dụng mẫu thiết kế của Nhà nước được giải thích cho instace here. Bạn sẽ xác định vài trạng thái và sau đó theo điều kiện quyết định cái nào trong số chúng nên được sử dụng trong thời điểm này.

Ví dụ:

abstract class State 
{ 
    abstract vod Apply(Form context); 
} 

class StateOne : State 
{ 
    override void Apply(Form context) 
    { 
     img1.Opacity= 1; 
     img2.Opacity = 0.5; 
     img3.Opacity = 0.5; 
    } 
} 

Bạn cũng có thể kết hợp nó với các mô hình phương pháp thiết kế Nhà máy đó sẽ quyết định nhà nước để sử dụng.

static class StateFactory 
{ 
    static State GetState(condition) 
    { 
     if(condition == something) 
      return new StateOne(); 
     else ... 
    } 
} 

Điều này sẽ không xóa báo cáo chuyển đổi khỏi mã của bạn, nhưng ít nhất nó sẽ ở nơi hợp lý để thực hiện điều hợp lý.

Cách sử dụng:

StateFactory.GetState(condition).Apply(this); 
+0

Tôi đang nhận được ý tưởng. Tuy nhiên, bạn có thể giải thích thêm một chút không? Vì vậy, trong SelectionChanged của tabcontrol, Làm thế nào tôi sẽ biết đối tượng nhà nước tôi sẽ cần? – NoobDeveloper

+1

@Nexus Tôi nghĩ bạn thực sự có thể loại bỏ các câu lệnh hoặc câu lệnh swtich, nhưng bạn có thể đặt chúng vào một nơi mà bạn sẽ không thấy chúng thường xuyên, chỉ khi bạn cần thêm một trạng thái mới. Tôi đã cập nhật mã cho tôi bằng phương thức Factory cho bạn. –

+0

+1, nhưng tôi muốn sử dụng 'Dictionary 'để giữ và truy xuất trạng thái (ví dụ:' _states [tab.SelectedIndex] .Apply (this) ') – Will

1

Tôi nghĩ rằng bạn có thể xử lý này trong XAML của bạn thân bằng cách sử dụng Triggers.

Ngoài ra nếu bạn muốn có đơn vị này kiểm chứng, bạn nên sử dụng MVVM pattern nơi bạn sẽ xác định properties for SelectedIndex, Opacities trong ViewModel của bạn và ràng buộc họ XAML

+0

EDIT: Đó là chính xác những gì tôi đã làm. Nhưng cố ý không đăng nó trong câu hỏi của tôi. câu hỏi của tôi vẫn như cũ. Làm thế nào tôi sẽ kiểm tra máy ảo của tôi sau đó? – NoobDeveloper

+2

nếu bạn đang sử dụng MVVM thì bạn có thể viết các trường hợp kiểm tra cho thuộc tính ViewModel của bạn cho opaciteis của hình ảnh sẽ được thay đổi khi bạn thay đổi thuộc tính selectedindex – Nitin

0

Nếu bạn có một loạt các dữ liệu tùy ý mà bạn cần phải vượt qua trong. .. Sau đó, có thực sự không phải là một cách để có được xung quanh báo cáo chuyển đổi dễ dàng (đó là giá trị nỗ lực, ít nhất). Tôi sẽ đề nghị, ít nhất là về khả năng đọc mã, để sử dụng một enum. Bạn có thể cấu trúc lại mã của mình như sau:

switch ((ImageTypes)Tab.SelectedIndex) 
    { 
     case ImageTypes.TypeOne: 
      img1.Opacity= 1; 
      img2.Opacity = 0.5; 
      img3.Opacity = 0.5; 
      break; 
     case ImageTypes.TypeTwo: 
      img1.Opacity = 0.5; 
      img2.Opacity = 1; 
      img3.Opacity = 0.5; 
      break; 
     case ImageTypes.TypeThree: 
      img1.Opacity = 0.5; 
      img2.Opacity = 0.5; 
      img3.Opacity = 1; 
      break; 
    } 
    public enum ImageTypes 
    { 
     TypeOne, 
     TypeTwo, 
     TypeThree 
    } 
1

Trích xuất và tiêm. Giải nén xem thay đổi logic (switch) đến lớp/phương pháp bên ngoài và tiêm nó vào xem của bạn:

public void HighlightImages(int selection, params Image[] images) 
{ 
    switch (selection) 
    { 
     case 0: 
      images[0].Opacity= 1; 
      images[1].Opacity = 0.5; 
      images[2].Opacity = 0.5; 
      break; 
     case 1: 
      images[0].Opacity = 0.5; 
      images[1].Opacity = 1; 
      images[2].Opacity = 0.5; 
      break; 
     case 2: 
      images[0].Opacity = 0.5; 
      images[1].Opacity = 0.5; 
      images[2].Opacity = 1; 
      break; 
    } 
} 

Trong lựa chọn thay đổi handler bạn chỉ cần ủy xử lý để phụ thuộc tiêm:

private void SelectedIndexChanged(object sender, EventArgs e) 
{ 
    this.highlighter.HighlightImages(Tab.SelectedIndex, img1, img2, img3); 
} 

Bằng cách này bạn sẽ có có thể kiểm tra logic thay đổi độ mờ một cách dễ dàng mà không cần phải điều khiển chế độ xem toàn diện.

0

Điều này sẽ không loại bỏ hoàn toàn, vì không có nhiều việc phải làm ngoài việc tạo ra một di sản hạng lớn, nhưng điều đó sẽ hơi quá mức cho tình huống này.

Thay vào đó, bạn có thể giảm kích thước của nó như thế này:

switch (Tab.SelectedIndex) 
{ 
    img1.Opacity = 0.5; 
    img2.Opacity = 0.5; 
    img3.Opacity = 0.5; 

    case 0: 
     img1.Opacity += 0.5; 
     break; 
    case 1: 
     img2.Opacity += 0.5; 
     break; 
    case 2: 
     img3.Opacity += 0.5; 
     break; 
} 

Và bạn có thể giảm mã dự phòng với các phương pháp, vì vậy bạn không cần phải thay đổi 0,5 ở khắp mọi nơi mỗi khi bạn muốn thay đổi độ mờ đục. (Đặt 0.5 trong một hằng số sẽ được tốt đẹp quá):

switch (Tab.SelectedIndex) 
{ 
    SetInitialOpacity(img1); 
    SetInitialOpacity(img2); 
    SetInitialOpacity(img3); 

    case 0: 
     IncreaseOpacity(img1); 
     break; 
    case 1: 
     IncreaseOpacity(img2); 
     break; 
    case 2: 
     IncreaseOpacity(img3); 
     break; 
} 

private void SetInitialOpacity(Image image) 
{ 
    image.Opacity = 0.5; 
} 


private void IncreaseOpacity(Image image) 
{ 
    image.Opacity += 0.5; 
} 
0

Đề cập đến những gì "jimmy-tâm" cho biết, đây là những gì tôi sẽ đi cho:

public static void HighlightImages(int selection, params Image[] images) 
    { 
     for (int img = 0; img < images.Length; img++) 
     { 
      images[img].Opacity = (img == selection ? 1 : 0.5); 
     } 
    } 
Các vấn đề liên quan