2009-09-29 31 views
14

Tôi đang tạo một điều khiển tùy chỉnh đơn giản mở rộng từ nút bật tắt cho phép người dùng chỉ định nội dung được chọn và bỏ chọn trực tiếp trong XAML. Nó hoạt động tốt nhưng nó được dựa trên một kích hoạt, và tôi không biết làm thế nào để xác định kích hoạt ngoại trừ trong một phong cách. Nếu tôi xác định phong cách, sau đó tôi mất bất cứ thứ gì được đặt bên ngoài điều khiển tùy chỉnh.Cách thêm trình kích hoạt vào điều khiển tùy chỉnh WPF mà không ghi đè kiểu hiện có?

Những gì tôi muốn có thể làm là chỉ cần gắn thêm trình kích hoạt này vào bất kỳ kiểu hiện có nào được đặt ở nơi khác trên điều khiển.

Đây là XAML cho kiểu/trình kích hoạt.

<ToggleButton.Style> 
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}"> 
     <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" /> 
     <Style.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Content" 
         Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ToggleButton.Style> 

Tôi đã thử kế thừa kiểu thông qua BaseOn với loại mặc định nhưng nó sẽ không hoạt động nếu điều khiển tùy chỉnh có kiểu thiết lập rõ ràng bởi cha mẹ. Tôi cũng coi EventTriggers nhưng tôi không tin rằng sẽ có một sự kiện để khởi tạo sự kiểm soát.

Cảm ơn bạn đã giúp đỡ bất kỳ ai có thể cung cấp. :)

Trả lời

17

Chỉ để làm rõ mọi thứ về thuật ngữ ở đây: A điều khiển người dùng là điều khiển xuất phát từ lớp UserControl. Nếu tôi hiểu bạn ngay bạn bắt nguồn từ ToggleButton để thêm các thuộc tính UncheckedContent và CheckedContent. Trong trường hợp đó, bạn đã tạo một điều khiển tùy chỉnh tùy chỉnh. Sẽ dễ dàng hơn nếu chúng tôi đồng ý với các thuật ngữ phổ biến :)

Theo tôi biết, bạn không thể thực hiện việc thừa kế kiểu chung trong XAML. Bạn luôn phải xác định rõ kiểu dáng nào khác dựa trên kiểu. Phong cách của bạn có thể dựa trên kiểu mặc định cho ToggleButton hoặc theo một kiểu khác cụ thể. Nếu bạn không thể xây dựng một chuỗi thừa kế kiểu mà tôn trọng điều đó, cách tiếp cận này sẽ không hoạt động.

Nhưng vì bạn có điều khiển tùy chỉnh, bạn có thể viết kiểu mặc định cho nó dựa trên kiểu nút chuyển đổi mặc định như thế này không?

<Style TargetType="{x:Type CustomToggleButton}" 
     BasedOn="{StaticResource {x:Type ToggleButton}}"> 

Sau đó, bất cứ khi nào bạn áp dụng phong cách rõ ràng cho nút chuyển đổi, bạn sẽ chỉ định rằng nó dựa trên kiểu nút chuyển đổi mặc định.

Ngoài ra, bạn có thể viết mẫu điều khiển (mặc định) cho nút chuyển đổi mới trong Chủ đề \ Generic.xaml chứa các trình kích hoạt ở trên. Trong pha trộn, bạn có thể lấy một bản sao của mẫu mặc định cho nút bật tắt ("Chỉnh sửa mẫu" -> "Chỉnh sửa bản sao") để bạn có thể đảm bảo nút chuyển đổi của bạn trông giống như nút chuyển đổi bình thường. Sau đó, kết hợp các trình kích hoạt ở trên vào mẫu đó.

BTW: bạn không phải tạo điều khiển mới chỉ để thêm thuộc tính mới. Bạn có thể thêm thuộc tính mới vào điều khiển hiện tại bằng cách sử dụng attached properties. Chúng có thể được sử dụng từ XAML giống như các thuộc tính bình thường.

+0

Cảm ơn bạn đã nhập, nó rất hữu ích. Tôi đã đi một con đường khác nhau nhỏ và mở rộng các phong cách hiện có trong mã phía sau để thêm kích hoạt của tôi mà không làm hỏng một hiện tại. Đề xuất BasedOn bạn đã thực hiện mà tôi đã thử và không hoạt động nếu một kiểu dáng rõ ràng được thiết lập. Tôi đã có từ ý tưởng của bạn mặc dù vì vậy tôi đánh dấu nó như là câu trả lời. Ý tưởng thuộc tính đính kèm thực sự tốt và tôi đã thực hiện thay đổi đó, cảm ơn bạn. :) –

+1

Bạn có nhớ gửi một số chi tiết về những gì bạn đã làm không? Tôi cũng muốn làm điều tương tự. – stone

+0

Điều này vừa lưu cho tôi rất nhiều mã. Cảm ơn! – MattS423

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