我正在使用Infragistics XamDateTimeEditor控件,我想向其添加依賴項屬性以允許開發人員在控件獲取焦點時選擇所有文本。我創建了一種用於設置我想要的行爲的樣式,但我希望開發人員根據布爾依賴項屬性決定是否應該執行行爲。我不確定這是如何完成的。將依賴項屬性添加到控件
6
A
回答
16
我假設你爲此繼承了XamDateTimeEditor。
如果你可以編寫代碼引用一個「標準」(CLR)的財產,那麼你是好去:
- 聲明你的DependencyProperty
刪除您的支持字段和替換的實施標準屬性,以便它訪問DependencyProperty而不是後臺字段。
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); } } }
然後,當你在你的代碼中訪問IsSelectOnFocusEnabled它將返回依賴項屬性的當前值。
你也可以設置它來接收通知,每當屬性發生變化,但我不明白你爲什麼會在你的情況。
此技巧還有另一種選擇,如果您願意,它不使用繼承和附加屬性。
UPDATE:
OK,因爲它要求的,這裏有一個方法來實現,對於任何文本框。應該很容易翻譯成你使用其他類型的控制進行的事件。
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();
}
}
您使用其計算方法如下,例如方式:
<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>
這說明你如何設置該屬性激活的行爲,以及如何將其綁定到別的東西,如果需要是。 請注意,此特定示例並不完美(如果通過選項卡工作,如果在控件內部單擊,文本框具有實際取消選擇文本的內部邏輯,但這只是一個示例,說明如何通過附加屬性將行爲附加到控件)。
相關問題
- 1. 將依賴項屬性添加到從控件繼承的類?
- 2. 如何將依賴項屬性添加到WPF中的圖像?
- 3. 將依賴項屬性添加到WPF行爲
- 4. 將依賴項屬性添加到文本框
- 5. 如何將PropertyChangedCallback添加到基類的依賴項屬性?
- 6. 將BoundingRectangle綁定到自定義控件依賴項屬性
- 7. 如何將依賴項屬性綁定到WPF中的控件?
- 8. 將依賴屬性附加到用戶控件
- 9. 將依賴項添加到Android項目
- 10. WPF將屬性綁定到子控件中的依賴項屬性
- 11. ngMockE2E - 添加到依賴性
- 12. WPF綁定到控件模板上的非依賴項屬性
- 13. 用戶控件的依賴項屬性沒有得到在Silverlight
- 14. WPF從FindAncestor到依賴項屬性自定義控件的
- 15. WPF - 綁定失敗到用戶控件依賴項屬性
- 16. 綁定到自定義控件的嵌套依賴項屬性
- 17. 將屬性數據綁定到兩個依賴項屬性
- 18. 將'Current'屬性添加到ASP.NET控件
- 19. 將屬性添加到子控件
- 20. 將屬性添加到窗體控件
- 21. 自定義控件依賴屬性綁定到屬性
- 22. 將依賴屬性添加到現有的.NET類
- 23. Gradle - 將屬性文件添加爲運行時依賴關係
- 24. 將依賴屬性註冊到內部控件中
- 25. 將Maven依賴項添加到Eclipse插件項目
- 26. 容易依賴項屬性
- 27. 使用依賴項屬性
- 28. 清除依賴項屬性
- 29. 組合依賴項屬性
- 30. 依賴項屬性繼承
如果XamDateTimeEditor沒有擴展DependencyObject會怎麼樣?代碼不會編譯。例如,我正在擴展一個行爲,並希望添加一個依賴項屬性,我不能。 – rolls 2016-11-18 03:29:33