![](/img/trans.png)
[英]how to display drawingvisual on canvas above child UIElements of Canvas defined in XAML
[英]How to bind UIElements in XAML?
我有一節課:
class LinkedTextBox: TextBox
{
public TextBox TextBoxA { get; set; }
public TextBox TextBoxB { get; set; }
}
說我有兩個文本框:
<TextBox x:Name="txt1" />
<TextBox x:Name="txt2" />
如何在我的Xaml上指定TextBoxes?
我的測試:
(1)“ TypeBox ” 的TypeConverter不支持從字符串轉換。 “
<local:LinkedTextBox TextBoxA="txt1" TextBoxB="txt2" />
(2)“ A'Binding'不能在'LinkedTextBox'類型的'TextBoxA'屬性上設置。'Binding'只能在DependencyObject的DependencyProperty上設置。 ”
<local:LinkedTextBox
TextBoxA="{Binding ElementName=txt1}"
TextBoxB="{Binding ElementName=txt2}"
/>
我認為有一種明顯的方法可做,但我不知道如何......
對。 你的第二個例子是正確的XAML,但它失敗了,因為TextBoxA
和TextBoxB
屬於錯誤的屬性。 Binding
的目標必須是DependencyProperty
的DependencyObject
,就像在錫上所說的那樣。 TextBox
已經是一個DependencyObject
,你正在對它進行子類化,因此該部分需要處理。 定義DependencyProperty
是微不足道的。
您需要定義TextBoxA
這個樣子,和TextBoxB
同樣:
public class LinkedTextBox : TextBox
{
#region TextBoxA Property
public TextBox TextBoxA
{
get { return (TextBox)GetValue(TextBoxAProperty); }
set { SetValue(TextBoxAProperty, value); }
}
// Careful with the parameters you pass to Register() here.
public static readonly DependencyProperty TextBoxAProperty =
DependencyProperty.Register("TextBoxA", typeof(TextBox), typeof(LinkedTextBox),
new PropertyMetadata(null));
#endregion TextBoxA Property
}
但你的意圖是什么? 你想達到什么目的? 你很可能通過以正常方式將現有屬性彼此綁定來實現它,而沒有任何這些子類monkeyshines。 可能你想要一個附加屬性 ,這是一種特殊類型的依賴屬性。
OP希望添加說明文本框之間關系的視覺元素。 如果你想添加一個視覺疊加層,那么WPF的方法就是寫一個Adorner 。 因此,您將使用TextBoxA
和TextBoxB
依賴項屬性編寫某種TextBoxLinkingAdorner
,並將其應用於主文本框,這取決於您的要求甚至可能不必是子類。
您的依賴屬性可能需要在其值更改時執行一些操作; 如果是這樣,假設一個名為TextBoxLinkerAdorner
的Adorner
子類,它們看起來更像這樣:
#region TextBoxA Property
public TextBox TextBoxA
{
get { return (TextBox)GetValue(TextBoxAProperty); }
set { SetValue(TextBoxAProperty, value); }
}
public static readonly DependencyProperty TextBoxAProperty =
DependencyProperty.Register("TextBoxA", typeof(TextBox),
typeof(TextBoxLinkerAdorner),
new FrameworkPropertyMetadata(null,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
TextBoxA_PropertyChanged)
{ DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
protected static void TextBoxA_PropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
var obj = d as TextBoxLinkerAdorner;
}
#endregion TextBoxA Property
如果您在文本框中查看的是它們的大小和位置,您可以編寫一個鏈接任意UIElements
而不僅僅是文本框的裝飾器。 天空是極限! 如果你能夢想它,你可以裝飾它!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.