5

tôi muốn thêm trình xử lý sự kiện tùy chỉnh vào các phần tử khung mặc định bằng cách sử dụng DependencyProperties.Tạo thuộc tính phụ thuộc để thiết lập EventHandlers tùy chỉnh trong XAML

Something như sau:

<Border custom:MyProps.HandleMyEvent="someHandler">...</Border> 

Đây là mã đằng sau cho sự kiểm soát có chứa các yếu tố Border:

public class MyPage : Page{ 
    public void someHandler(object sender, EventArgs e){ 
     //do something 
    } 
} 

Đây là mẫu sơ bộ thế nào tôi tưởng tượng lớp định nghĩa thuộc tính:

public class MyProps{ 
    public event EventHandler MyInternalHandler; 
    public static readonly DependencyProperty HandleMyEventProperty = ... 
    public void SetHandleMyEvent(object sender, EventHandler e){ 
     MyInternalHandler += e; 
    } 
} 

Vấn đề là tôi không biết/không tìm thấy bất kỳ gợi ý cách kết hợp DependencyProperties với các sự kiện/đại biểu và EventHandlers.

Bạn có đầu mối không?

+0

Chúng tôi có thể nhận được gợi ý về vấn đề mà giải pháp này dành cho không? Nếu bạn đang xem xét thêm sự kiện vào các phần tử khung mặc định, chỉ cần phân lớp hoặc sử dụng Hành vi. –

Trả lời

5

Tôi sẽ giả định điều này không liên quan gì đến WPF, đây là câu hỏi về Silverlight.

Trước hết, bạn không thể chỉ cần thêm Event vào điều khiển hiện tại. Sau khi tất cả các bạn đang thêm đính kèm Properties trong khi các sự kiện được xử lý khác nhau, chúng không phải là tài sản.

Bạn cần phải tạo loại mới có sự kiện này sau đó tạo thuộc tính đính kèm thuộc loại này.

Đây là một loại hình cơ bản mà chỉ đơn giản có một sự kiện: -

public class MyEventer 
{ 
    public event EventHandler MyEvent; 

    // What would call this?? 
    protected void OnMyEvent(EventArgs e) 
    { 
     if (MyEvent != null) 
     MyEvent(this, e); 
    } 
} 

Bây giờ chúng ta tạo ra một tài sản gắn liền trong đó có MyEventer như tài sản của mình, tôi thích để đặt chúng trong một lớp tĩnh riêng biệt.

public static class MyProps 
{ 

    public static MyEventer GetEventer(DependencyObject obj) 
    { 
    return (MyEventer)obj.GetValue(EventerProperty); 
    } 

    public static void SetEventer(DependencyObject obj, MyEventer value) 
    { 
    obj.SetValue(EventerProperty , value); 
    } 

    public static readonly DependencyProperty EventerProperty = 
     DepencencyProperty.RegisterAttached("Eventer", typeof(MyEventer), typeof(MyProps), null) 

    } 
} 

Bây giờ bạn đính kèm này cho một người kiểm soát như thế này: -

<Border ...> 
    <custom:MyProps.Eventer> 
     <custom:MyEventer MyEvent="someHandler" /> 
    </custom:MyProps.Eventer> 
</Border> 

Nếu bạn biên dịch dự án trước khi viết XAML này, bạn sẽ lưu ý rằng Visual Studio sẽ cung cấp cho bạn các tùy chọn cho nó để tạo trình xử lý sự kiện trong mã phía sau cho bạn.

Tất nhiên điều này vẫn còn để lại một câu hỏi quan trọng: Bạn dự định sẽ gây ra sự kiện như thế nào?

+0

Sự kiện này được kích hoạt bởi khung tôi đang viết. Và khi bạn thể hiện chính xác, tôi cần một số hàm OnMyEvent để dễ dàng kích hoạt trình xử lý do người dùng định nghĩa. Bây giờ, người dùng có thể xác định trình xử lý tùy chỉnh hoặc tạo trình xử lý mới bằng cách sử dụng phím tab trong XAML. Rất đẹp, ngay cả khi tôi đã ưa thích DependencyProperty trực tiếp mà không cần thêm ..> ..>. <Đường viền c: MyProps.MyHandler = "..." /> sẽ đẹp hơn rất nhiều khi sử dụng. Dù sao, cảm ơn cho đầu vào có giá trị của bạn! :) – Juve

+0

Tuân thủ quy ước đặt tên khá xấu. –

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