しかし、判明したように、ウィンドウとコンポーネントのXAMLマークアップは、同じシンプルで非常に柔軟な方法で拡張できます。
拡張機能を使用する簡単な例は、よく知られた構造によってすべてに与えることができます
< Button Content ="{Binding Path=Title}" />
* This source code was highlighted with Source Code Highlighter .
Bindingは言語の拡張にすぎません。
そして今、あなたは長いコード行を通してのみ自分自身にバインドできるとき、前述の設計の欠点を修正する具体的な例です
< Button Content ="{Binding Path=Height,
RelativeSource={RelativeSource Self}}" />
* This source code was highlighted with Source Code Highlighter .
独自のSelfBinding拡張機能を作成します。
1.プロジェクトにクラスを追加し、SelfBindingと呼びます
2. MarkupExtensionからこのクラスを継承します
3.タイプstringのPathプロパティを追加します
4.空のコンストラクターを作成する
5. 1つのパラメーター文字列パスを持つコンストラクターを作成します
public SelfBinding( string Path)
{
this .Path = Path
}
* This source code was highlighted with Source Code Highlighter .
6. ProvideValueメソッドを再定義します
public override object ProvideValue(IServiceProvider serviceProvider)
{
try
{
if ( string .IsNullOrEmpty(Path))
throw new ArgumentNullException( "Path" , "The Path can not be null" );
// ,
var providerValuetarget = (IProvideValueTarget)serviceProvider
.GetService( typeof (IProvideValueTarget));
// ,
DependencyObject _targetObject = (DependencyObject)providerValuetarget.TargetObject;
//
PropertyInfo _sourceProperty = _targetObject.GetType().GetProperty(Path);
//
return _sourceProperty.GetValue(_targetObject, null );
}
catch (Exception ex)
{
Debug.WriteLine(ex);
return null ;
}
}
* This source code was highlighted with Source Code Highlighter .
これで確認できます
< Window x:Class ="for7raid.wpfExtension.Window1"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local ="clr-namespace:for7raid.wpfExtension"
Title ="Window1" Height ="300" Width ="300" >
< Grid >
< Button Content ="{local:SelfBinding Foreground}" />
</ Grid >
</ Window >
* This source code was highlighted with Source Code Highlighter .
すべてが判明したので、標準のバインディングで行われているように、コンバーターを使用する機能を追加する必要があります。
7. IValueConverter型のプロパティコンバーターを追加し、結果を返すときにそれを確認します
// ,
if (Converter != null )
return Converter. Convert ( value , _targetProperty.PropertyType, null ,
Thread.CurrentThread.CurrentCulture);
else
return value ;
* This source code was highlighted with Source Code Highlighter .
それだけです!
まず、Namespaseを標準の名前空間にインポートします。これにより、各拡張子の前に接頭辞を記述する必要がなくなります。 Assembly.csファイルに次の行を追加し、プロジェクトをビルドします
[assembly: XmlnsDefinition( "http://schemas.microsoft.com/winfx/2006/xaml/presentation" , "for7raid.wpfExtension" )]
* This source code was highlighted with Source Code Highlighter .
TODO:
1.トリガーを追加してプロパティを変更し、ライブバインディングが存在するようにします
2.次の形式でパスのタスクを実装することが可能です:Path = Foreground.Name
このようにして、いくつかの問題を解決できます。たとえば、多言語対応のサポートを構築したり、ユーザーの権限に応じてフォーム上の要素の表示を監視したマネージャーを構築したりします。
< Button Content ="{Title btnKey, Default=Hello button}" ,
Visability ="{AllowedBy All sp1 sp2 sp3}" />
* This source code was highlighted with Source Code Highlighter .
ソースコード
続きを読む: マークアップ拡張機能とXAML
WPF多言語マークアップ拡張機能