序文
私は早くWPFで学んだ、財産への依存度が場所の非常に理解されている、その結果は、必要にペーストをコピーするために、コードの上にオンにするとき、すべての時間が私は依存関係プロパティを記述することです。
私は私の友人の多くを信じて、私は同じ経験をしましたので、この記事では、単に依存関係プロパティの友人を学ぶために始めている人たちを助けることを望ん。
これらの記事に説明[嫌い]依存関係プロパティ
初心者は、友人の面で使用することを学んだだけでなく書かれているこれらの記事の定義および使用に依存するが、それは依存関係プロパティに相対的である確かに一つのこと、百度、グーグル、MSDNに直面するだろうか、プロパティを表示します。
まず第一に、あまりにも多くを言って誤解を招く恐れがあります。
たとえば、この記事では、の公式ウェブサイトですhttps://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/dependency-properties-overview
このような導入の依存関係プロパティ。
公共の静的な読み取り専用のDependencyProperty IsSpinningProperty = DependencyProperty.Register( "IsSpinning"、typeof演算(ブーリアン)、 typeof演算(MyCode) ); パブリックブールIsSpinning { 取得{リターン(ブール値)GetValueメソッド(IsSpinningProperty)。} {値の代入(IsSpinningProperty、値)を設定します。} }
彼は、定義がなされ、そしてそのように、あなたにその依存関係プロパティの定義形式を教えてください。
あなたが初心者であれば、あなたは非常に困難疑いたくありません。誰もがダウンしてバックアップするために、この定義を取ることはできませんので。
その結果、あなたと私のような、すべての時間があなたは、ペーストをコピーするに行かなければならない、依存関係プロパティを定義し、持っていました。しかし、定義が複雑すぎるので、これが最大の悪、最大の影響は、ありませんので、彼は、理解することで、その結果、ペースト依存関係プロパティをコピーすることを忘れないようにするために、あなたがあきらめて、あなたは依存関係プロパティの柔軟性を失います容量の使用。
正しく理解し、依存関係プロパティ
依存関係を理解するためにどのようにそれを正しく属性?
非常に単純な、それは理解することができる分割。
今、私たちは、依存関係プロパティを分割する必要があり、最初は彼の定義を分割し、財産の分割に依存します。
私たちは次のように、我々はプロパティを定義するプロパティを見てください。
プライベートブール_IsSpinning。 パブリックブールIsSpinning { {_IsSpinningを返します。} 集合{_IsSpinning =値。} }
その後、我々は次のようにオブジェクトクラスのDependencyPropertyの定義は、このオブジェクトはIsSpinningの性質に依存します使用します。
公共の静的な読み取り専用のDependencyProperty IsSpinningProperty
次のようにその後、我々は、依存オブジェクトは、プロパティIsSpinningに登録されたクラスになります。
(クラスの名前 "IsSpinning"、typeof演算(ブール値)、typeof演算(あなたの財産が配置されている))DependencyProperty.Register。
登録コードから、我々は彼が3つのメッセージを登録していることがわかります。
図1に示すように、現在のオブジェクト・クラス定義するDependencyProperty IsSpinningPropertyは、IsSpinning特性に依存します。
図2に示すように、同じ種類のタイプに依存し、オブジェクトIsSpinningProperty IsSpinningの特性がBOOLです。
プロパティIsSpinningカテゴリの3、オブジェクトクラスが宣言されているIsSpinningProperty登録は、すなわち、他のクラスでは、依存オブジェクトは表示されません。
今、私たちは、最終的な操作を行うには、プロパティを変更し、プロパティIsSpinningバインドされたオブジェクトのIsSpinningPropertyに依存します。
それを結合させる方法は?非常に単純な、我々は]プライベートブール_IsSpinningでプロパティを定義します[]交換してください、私たちはちょうど[IsSpinningPropertyを定義することができますに依存しています。
パブリックブールIsSpinning { 取得{リターン(ブール値)GetValueメソッド(IsSpinningProperty)。} {値の代入(IsSpinningProperty、値)を設定します。} }
ここでは、見たときに、それらの値を代入し、GetValueメソッドとSetValueをが、それらの二つがから来ているでしょうか?
我々はそれにフォームを使用することができ、なぜ我々が追跡し、F12を使用して、彼らは、メソッドがクラスのDependencyPropertyに定義されていることがわかりましたか?
簡単に言えば、私たちは私の窓の親のフォローアップ、ビジュアル親が遂にたDependencyPropertyを継承し、私たちが直接割り当てと依存オブジェクトの値を取得するにはGetValueメソッドとSetValueをを使用することができました。それは限り、サブクラスがたDependencyPropertyクラスを継承するとして、あなたは依存関係プロパティを使用することができ、あります。
コード内で定義されたフルバージョンの依存関係プロパティ:
パブリック静的読み取り専用たDependencyProperty IsSpinningProperty = DependencyProperty.Register( "IsSpinning"、typeof演算(BOOL)、typeof演算(DependecyUserControl))。 パブリックブールIsSpinning { 取得{リターン(ブール値)GetValueメソッド(IsSpinningProperty)。} {値の代入(IsSpinningProperty、値)を設定します。} }
ここでは、逃げるために、そして今、私たちは正しいことを最終的には非常に明確な依存関係プロパティである必要があり、分割の特性に応じて。
PSは:誰もがこれまで依存関係プロパティは、属性名+プロパティの名前する必要があることを告げています、そして、あなたはそれを信じています。ハハ。
単純なアプリケーションの依存関係プロパティ
今度は、メモリを強化するために、依存関係プロパティシステムの制御をカスタマイズできます。
パブリッククラスKButton:ボタン { 公共の静的な読み取り専用のDependencyProperty ForeImageProperty。 公共の静的な読み取り専用のDependencyProperty BackImageProperty。 公共の静的な読み取り専用のDependencyProperty MouseOverBackColorProperty。 公共の静的な読み取り専用のDependencyProperty StretchProperty。 静的KButton() { ForeImageProperty = DependencyProperty.Register( "ForeImage"、typeof演算(文字列)、typeof演算(KButton)、NULL); ForeImageProperty = DependencyProperty.Register( "BackImage"、typeof演算(文字列)、typeof演算(KButton)、NULL); MouseOverBackColorProperty = DependencyProperty.Register( "MouseOverBackColor"、typeof演算(ブラシ)、typeof演算(KButton)、NULL); StretchProperty = DependencyProperty.Register( "ストレッチ"、typeof演算(ストレッチ)、typeof演算(KButton)、NULL); DefaultStyleKeyProperty.OverrideMetadata(typeof演算(KButton)、新しいFrameworkPropertyMetadata(typeof演算(KButton))); //使KButton去读取KButton类型的样式、而不是去读取ボタン的样式 } パブリック文字列ForeImage { 取得{戻り値(文字列) GetValueメソッド(ForeImageProperty)。} {値の代入(ForeImageProperty、値)を設定します。} } パブリック文字列BackImage { 取得{戻り(列)のGetValue(BackImageProperty)。} {値の代入(BackImageProperty、値)を設定します。} } パブリックブラシMouseOverBackColor { 取得{戻り(ブラシ)のGetValue(MouseOverBackColorProperty)。} {値の代入(MouseOverBackColorProperty、値)を設定します。} } 公共ストレッチストレッチ { 取得{戻り(ストレッチ)のGetValue(StretchProperty)。} {値の代入(StretchProperty、値)を設定します。} } }
上記のコードに示すように、我々はKButtonにボタンを継承するクラスを定義します。
KButtionでは、我々は4依存の属性を定義しました。
ForeImageProperty:前景画像ボタン。
BackImageProperty:背景画像ボタン。
MouseOverBackColorProperty:カラーマウスのボタンの上。
StretchProperty:伸縮モードボタン画像。
コードは、外側の4つの依存関係プロパティに加えて、何も非常に単純ではありません。今、私たちは、スタイルのKbuttonタイプを定義する必要があります。
プレゼンテーションを容易にするために、私は、ファイルにApp.xaml内のスタイル定義を指示します。
<スタイルTargetTypeに= "{X:タイプローカル:KButton}"> <setterプロパティ= "テンプレート"> <Setter.Value> <たControlTemplate> <DockPanel NAME = "dpCon"幅= "{バインディング幅、RelativeSource = {X:静的RelativeSource.TemplatedParent}} " 高さ= "{バインディング身長、RelativeSource = {X:静的RelativeSource.TemplatedParent}}" 背景= "{バックグラウンド結合、RelativeSource = {X:静的RelativeSource.TemplatedParent}}" ツールヒント=" {バインディングヒント、RelativeSource = {X:静的RelativeSource.TemplatedParent}}」 > <DockPanel DockPanel.Dock = "トップ" NAME = "dpBtn"> <DockPanel.Background> <ImageBrush ImageSourceは= "{バインディングForeImage、RelativeSource = {X:静的RelativeSource.TemplatedParent}}"ストレッチ= "{バインディングストレッチ、RelativeSource = {X:静的RelativeSource.TemplatedParent}} "/> </DockPanel.Background> <テキストブロックのFontSize =" 15" VerticalAlignmentを= "センター"たHorizontalAlignment = "センター"前景= "#1 f9fcff"テキスト= "{バインディングコンテンツ、RelativeSource = {X:静的RelativeSource.TemplatedParent}} "> </のTextBlock> </ DockPanel> </ DockPanel> <ControlTemplate.Triggers> <DataTriggerバインド= "{IsMouseOver結合、RelativeSource = {X:静的RelativeSource.Self}}"値= "TRUE"> <setterプロパティ= "背景" TargetNameは= "dpBtn"> <Setter.Value> <ImageBrush ImageSourceは=」 {BackImage結合、RelativeSource = {X:静的RelativeSource.TemplatedParent}}」ストレッチ= "{バインディングストレッチ、RelativeSource = {X:静的RelativeSource.TemplatedParent}}" /> </Setter.Value> </セッター> <setterプロパティ= "背景" TargetNameは= "dpCon"値= "{バインディングMouseOverBackColor、RelativeSource = {X:静的RelativeSource.TemplatedParentは}}"> </セッター> </ DataTrigger> <DataTriggerは{BackImage、RelativeSourceバインディング」=バインディング= {X:静的RelativeSource.Self}、モード=双方向}」値= "{X:ヌル}"> <setterプロパティ= "背景" TargetNameは= "dpBtn"> <Setter.Value> <ImageBrush ImageSourceは=" {バインディングForeImage、RelativeSource = {X:静的RelativeSource.TemplatedParent}} "ストレッチ="{ストレッチ結合、RelativeSource = {X:静的RelativeSource.TemplatedParent}} "/> </Setter.Value> < /セッター> </ DataTrigger> <トリガープロパティ= "でIsEnabled"値= "true"を/> <トリガープロパティ= "でIsEnabled"値= "偽"> <setterプロパティ= "フォアグラウンド"値= "グレー" /> </トリガー> </ControlTemplate.Triggers> </ ControlTemplateの> </Setter.Value> </セッター> </スタイル>
上記のようなスタイルのコードは、また、非常に簡単で、テンプレート内のテンプレートの定義し、[OK]ボタンの配置、背景画像とボタンのテキストです。私たちは、その後、事前に定義されている依存プロパティを対応する値にバインドされています。
請求例えば{バインディングForeImage、RelativeSource = {X:静的RelativeSource.TemplatedParent}}のように、RelativeSource.TemplatedParentを使用して、テンプレート内の結合特性をそのカスタム依存性に注意してください。
イベントDataTriggerデータテンプレートでは、結合モードは、2つのタイプの特性に依存しています。
まず、などRelativeSource.Selfを使用してイベント条件DataTrigger結合データ、{IsMouseOver結合、RelativeSource = {X:静的RelativeSource.Self}}。
第二の条件は、{:静的RelativeSource.TemplatedParent}結合BackImage、RelativeSource = {X}として、RelativeSource.TemplatedParentを使用して、トリガテンプレートを変更し、セットアップします。
-------------------------------------------------- --------------------------------------------------
今、私たちは私たちのカスタム制御コードを駆使であり、次のとおりです。
<DockPanel> <StackPanelの> <ローカル:KButton高さ= "50"幅= "50"ストレッチ= "なし" ForeImage = "/画像/关闭.pngの" BackImage = "/画像/关闭退出.pngの"背景= "グレー"MouseOverBackColor ="ブラウン"/> <ローカル:KButton高さ=" 50"幅= "50"証拠金= "0,10,0,0"ストレッチ= "なし" ForeImage = "/画像/关闭.pngの"背景= "グレー" MouseOverBackColor = "ブラウン" /> <ローカル:KButton高さ= "100"幅= "100"証拠金= "0,10,0,0"コンテンツ= "篮子"ストレッチ= "塗りつぶし" ForeImage = "/画像/篮子.pngの」背景= "灰色" MouseOverBackColor = "ブラウン" /> </ StackPanelの> </ DockPanel>
次のようにインターフェイスの効果は以下のとおりです。
カスタムユーザーコントロールの依存関係プロパティを使用して
まず、我々は新しい項目を追加し、ユーザーコントロールを選択します。
電流制御のDataContext自体-this.DataContext =これを設定する一方、その後、我々は、依存関係プロパティHeaderTitleを追加します。
公共の文字列HeaderTitle { 取得{戻り値(文字列)のGetValue(HeaderTitleProperty)。} {値の代入(HeaderTitleProperty、値)を設定します。} } パブリック静的読み取り専用たDependencyProperty HeaderTitleProperty = DependencyProperty.Register( "HeaderTitle"、typeof演算(文字列)、typeof演算(DependecyUserControl)、NULL); パブリックDependecyUserControl() { this.DataContext =この; InitializeComponent(); }
今、私たちはのTextBlockのXAMLページにユーザーコントロールを追加し、我々だけのコードは以下のように定義したように、彼のテキストをHeaderTitleバインドします。
<Grid> <TextBlock Text = "{Binding HeaderTitle}" TextAlignment="Center"></TextBlock> </Grid>
接着我们回到主窗体,引用这个用户控件,代码如下所示:
<local:DependecyUserControl Height = "30" HeaderTitle="我是Header" DockPanel.Dock="Top"></local:DependecyUserControl>
运行结果:
可以看到,我们成功在主页面设置了用户控件的依赖属性,并让他成功的绑定到了用户控件中的TextBlock的Text属性。也就是说,我们简单的实现了Header的Title动态设置。
结语
WPF拥有非常强大的自定义能力,而,正确的学会了依赖属性是体会到它强大的第一步。
----------------------------------------------------------------------------------------------------
到此WPF依赖属性的正确学习方法就已经讲解完成了。
代码已经传到Github上了,欢迎大家下载。
Github地址:https://github.com/kiba518/WpfDependency
----------------------------------------------------------------------------------------------------
注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!