2010-02-26 14 views

Trả lời

1

Bạn cần tạo riêng của mình để đáp ứng các tùy chọn của riêng bạn. Một mẹo sẽ là để bạn tạo một biểu mẫu cơ sở có tên là "frmWizard", khi đó tất cả các cửa sổ thuật sĩ của bạn sẽ kế thừa từ nó. Bạn nên đặt các đối tượng chung hoặc các đối tượng thuật sĩ trên lớp cơ sở và sửa đổi \ ghi đè chúng trên lớp dẫn xuất nếu cần.

+1

Nó rất hữu ích để kết hợp hình thức cơ bản (được đề xuất ở đây) + điều khiển tab tùy chỉnh (được mô tả trong câu trả lời khác). Việc tạo nền tảng cho trình thuật sĩ rất hữu ích, đặc biệt khi ứng dụng có nhiều hơn một trình hướng dẫn. Nó giúp tránh việc sao chép mã hóa kinh dị. – miroxlav

+0

Các phương thức hữu dụng mà tôi thường thực hiện trong lớp cơ sở là .. 'OnPageEntered', 'OnPageExited',' AllowNext', 'AllowBack', vv – KDecker

126

Rất nhiều cách để thực hiện. Tạo một biểu mẫu cho từng bước của trình hướng dẫn là có thể, nhưng rất khó xử. Và xấu xí, rất nhiều nhấp nháy khi người dùng thay đổi bước. Thực hiện từng bước mà UserControl có thể hoạt động, bạn chỉ cần chuyển chúng vào và ra khỏi bộ sưu tập Điều khiển của biểu mẫu. Hoặc làm cho một trong số họ Hiển thị = true cho mỗi bước. Tuy nhiên, thiết kế UC có xu hướng bị phức tạp, bạn phải thêm các thuộc tính công cộng cho từng mục giao diện người dùng.

Cách dễ dàng và RAD là sử dụng TabControl. Hoạt động rất tốt trong nhà thiết kế vì nó cho phép bạn chuyển đổi các tab ở thời gian thiết kế và thả các điều khiển trên mỗi tab. Chuyển đổi các bước là tầm thường, chỉ cần thay đổi thuộc tính SelectedIndex. Điều duy nhất không tầm thường là ẩn các tab trong thời gian chạy. Vẫn dễ thực hiện bằng cách xử lý tin nhắn Windows. Thêm một lớp mới vào biểu mẫu của bạn và dán mã được hiển thị bên dưới. Biên dịch. Thả điều khiển mới từ đầu hộp công cụ lên biểu mẫu của bạn.

using System; 
using System.Windows.Forms; 

class WizardPages : TabControl { 
    protected override void WndProc(ref Message m) { 
    // Hide tabs by trapping the TCM_ADJUSTRECT message 
    if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1; 
    else base.WndProc(ref m); 
    } 
} 
+4

+51: và bây giờ bạn có thể sử dụng điều khiển tab, ẩn các tab .. .và chuyển đổi giữa các trang tab với chỉ mục tab ... ??? Tôi sẽ sử dụng điều này ... đẹp hơn rất nhiều so với việc quản lý các bảng chồng chéo. – IAbstract

+0

@Hans Câu trả lời hay của Hans! Tôi chỉ là courius: điều này hoàn toàn ẩn các tab để người dùng không thể nhấp vào, hoặc kích hoạt chúng bằng phím TAB hittink hoặc một cái gì đó? –

+0

@ Sean87 nhấn CTRL + TAB thực sự di chuyển trên các trang tab – ccalboni

29
class WizardPages : TabControl 
{ 
    protected override void WndProc(ref Message m) 
    { 
     // Hide tabs by trapping the TCM_ADJUSTRECT message 
     if (m.Msg == 0x1328 && !DesignMode) m.Result = (IntPtr)1; 
     else base.WndProc(ref m); 
    }   

    protected override void OnKeyDown(KeyEventArgs ke) 
    { 
     // Block Ctrl+Tab and Ctrl+Shift+Tab hotkeys 
     if (ke.Control && ke.KeyCode == Keys.Tab) 
      return; 
     base.OnKeyDown(ke); 
    } 
} 
+0

Còn các phím khác thì sao? PageUp và PageDown? Hoặc phím mũi tên trái và phải? Bạn không thể thêm chúng bởi vì Bạn sẽ không thể di chuyển bên trong hộp văn bản là con của điều khiển đó. – Misiu

+0

Nếu bạn xử lý 'Ctrl' +' Tab' và 'Ctrl' +' Shift' + 'Tab' cũng đừng quên các từ tương đương' Ctrl' + 'PgUp' và' Ctrl' + 'PgDn'. Cái sau chiếm ưu thế hơn trong nhiều trường hợp trong đó 'Ctrl' +' Tab' và 'Ctrl' +' Shift' + 'Tab' được kiểm soát bên trong, ví dụ: multiline đầu vào hộp. – miroxlav

+0

@Misiu khóa bị hạn chế ở trên vẫn hoạt động tốt trong điều khiển con (tôi vừa thử nghiệm) – miroxlav

Các vấn đề liên quan