Tôi đang sử dụng điều khiển Infamistics XamDateTimeEditor và tôi muốn thêm thuộc tính phụ thuộc vào nó để cho phép nhà phát triển chọn có tất cả văn bản được chọn khi điều khiển được lấy nét. Tôi đã tạo một kiểu được sử dụng để thiết lập hành vi mà tôi muốn nhưng tôi muốn nhà phát triển quyết định xem hành vi có nên được thực hiện dựa trên thuộc tính phụ thuộc boolean hay không. Tôi không chắc làm thế nào được thực hiện.Thêm thuộc tính phụ thuộc để điều khiển
Trả lời
Tôi giả sử bạn được kế thừa từ XamDateTimeEditor cho việc này.
Nếu bạn có thể viết mã tham khảo một "tiêu chuẩn" (CLR) tài sản, sau đó bạn là tốt để đi:
- tuyên bố DependencyProperty bạn
loại bỏ lĩnh vực sao lưu của bạn và thay thế việc thực hiện tài sản tiêu chuẩn để nó truy cập DependencyProperty thay vì trường sao lưu.
public class MyXamDateTimeEditor : XamDateTimeEditor { public static readonly DependencyProperty IsSelectOnFocusEnabledProperty = DependencyProperty.Register("IsSelectOnFocusEnabled", typeof(bool), typeof(MyXamDateTimeEditor), new UIPropertyMetadata(false)); public boolIsSelectOnFocusEnabled { get { return (bool)GetValue(IsSelectOnFocusEnabledProperty); } set { SetValue(IsSelectOnFocusEnabledProperty, value); } } }
Sau đó, khi bạn truy cập IsSelectOnFocusEnabled trong mã của bạn, nó sẽ trả về giá trị hiện tại của tài sản phụ thuộc.
Bạn cũng có thể thiết lập để nhận thông báo bất cứ khi nào tài sản thay đổi, nhưng tôi không hiểu tại sao bạn lại gặp trường hợp này.
Ngoài ra còn có một tùy chọn khác cho thủ thuật này, sử dụng không có thừa kế và thuộc tính đính kèm nếu bạn muốn.
CẬP NHẬT:
OK, vì được yêu cầu, đây là cách để đạt được điều đó cho bất kỳ hộp văn bản nào. Sẽ dễ dàng dịch sang bất kỳ sự kiện nào bạn sử dụng để thực hiện điều đó trên một loại điều khiển khác.
public class TextBoxBehaviors
{
public static bool GetIsSelectOnFocusEnabled(DependencyObject obj)
{
return (bool)obj.GetValue(IsSelectOnFocusEnabledProperty);
}
public static void SetIsSelectOnFocusEnabled(DependencyObject obj, bool value)
{
obj.SetValue(IsSelectOnFocusEnabledProperty, value);
}
public static readonly DependencyProperty IsSelectOnFocusEnabledProperty =
DependencyProperty.RegisterAttached("IsSelectOnFocusEnabled", typeof(bool),
typeof(TextBoxBehaviors),
new UIPropertyMetadata(false, new PropertyChangedCallback(OnSelectOnFocusChange)));
private static void OnSelectOnFocusChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is TextBox)
{
var tb = d as TextBox;
if ((bool)e.NewValue)
{
tb.GotFocus += new RoutedEventHandler(tb_GotFocus);
}
else
{
tb.GotFocus -= new RoutedEventHandler(tb_GotFocus);
}
}
}
static void tb_GotFocus(object sender, RoutedEventArgs e)
{
var tb = sender as TextBox;
tb.SelectAll();
}
}
Cách bạn sử dụng nó như sau, ví dụ:
<Window x:Class="WpfApplication2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox Text="No Select All" x:Name="TextBox1"/>
<CheckBox Content="Auto Select"
Grid.Column="1"
IsChecked="{Binding Path=(local:TextBoxBehaviors.IsSelectOnFocusEnabled), ElementName=TextBox1, Mode=TwoWay}" />
<TextBox Grid.Row="1" Text="djkhfskhfkdssdkj"
local:TextBoxBehaviors.IsSelectOnFocusEnabled="true" />
</Grid>
</Window>
này cho bạn thấy làm thế nào để thiết lập thuộc tính để kích hoạt hành vi, và làm thế nào để ràng buộc nó vào cái gì khác nếu cần được. Lưu ý rằng ví dụ cụ thể này không hoàn hảo (nếu bạn duyệt qua nó, nếu bạn nhấp vào bên trong điều khiển, hộp văn bản có logic bên trong thực sự bỏ chọn văn bản, nhưng đó chỉ là ví dụ về cách đính kèm hành vi vào điều khiển thông qua thuộc tính đính kèm).
- 1. $ routeProvider - tiêm điều khiển phụ thuộc tùy thuộc vào URL
- 2. Thêm thuộc tính vào điều khiển WPF tùy chỉnh?
- 3. WPF Thêm thuộc tính tùy chỉnh trong điều khiển
- 4. Lỗi thuộc tính phụ thuộc
- 5. Làm cách nào để gắn kết thuộc tính của điều khiển với thuộc tính của điều khiển khác?
- 6. Làm cách nào để thêm logic vào cuộc gọi lại thuộc tính phụ thuộc hiện tại?
- 7. Silverlight: Thuộc tính điều khiển ràng buộc theo lập trình
- 8. Cách $ inject tự động phụ thuộc vào bộ điều khiển
- 9. Hiểu sự tiêm phụ thuộc vào bộ điều khiển AngularJS
- 10. Đặt loại thuộc tính cho điều khiển tùy chỉnh WPF?
- 11. Lâu đài windor Thêm phụ thuộc có điều kiện
- 12. Thuộc tính MVC trên Bộ điều khiển và Hành động
- 13. Điều khiển khung thực thể Thuộc tính quy tắc tạo thuộc tính
- 14. Cài đặt thuộc tính tùy thuộc vào điều khiển tùy chỉnh của WinRT/Binding
- 15. Thứ tự các điều khiển trong thuộc tính Điều khiển của biểu mẫu trong C#
- 16. Điều khiển người dùng (ascx) và các thuộc tính
- 17. Thêm thuộc tính Xml vào thuộc tính chuỗi
- 18. Nhanh chóng tạo thuộc tính phụ thuộc trong VS
- 19. Cách đặt thuộc tính Int của điều khiển trên ASCX?
- 20. Wix: Chỉnh sửa điều khiển không thiết lập thuộc tính
- 21. Sự khác biệt giữa Thuộc tính phụ thuộc SetValue() & SetCurrentValue()
- 22. Đặt thuộc tính VerticalAlignment cho tất cả các điều khiển
- 23. Thuộc tính phụ thuộc được triển khai như thế nào?
- 24. thuộc tính phụ thuộc vào một lĩnh vực khác
- 25. Làm thế nào để liệt kê tất cả các thuộc tính phụ thuộc của kiểm soát?
- 26. MATLAB Đánh giá Lười biếng trong Thuộc tính Phụ thuộc
- 27. Thuộc tính điều hướng 'FootballGame' không được tìm thấy trên loại phụ thuộc 'Bd.Domain.Entities.FootballGame'
- 28. Thuộc tính phụ thuộc trong Nhà máy Cô gái
- 29. Nghe các thay đổi của thuộc tính phụ thuộc
- 30. Tài liệu XML cho các thuộc tính phụ thuộc
Điều gì sẽ xảy ra nếu XamDateTimeEditor không mở rộng DependencyObject? Mã sẽ không biên dịch. Ví dụ tôi đang mở rộng một hành vi và muốn thêm một thuộc tính phụ thuộc vào nó mà tôi không thể. – rolls