問題タブ [markup-extensions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - XAML 2009 関連のマークアップ拡張機能を WPF で使用できますか?
x:Reference
やなどの拡張機能について話しているのでx:FactoryMethod
、まとめてここに表示されます。MSDN、Stackoverflow、およびその他の情報源を含む、オンラインで多くの矛盾する情報を読んでいます。
をx:Reference
例として説明しますが、実際には他のマークアップ拡張機能についても言及しています。混乱の主な原因は、MSDN からの次の抜粋です。
WPF では、XAML 2009 機能を使用できますが、WPF マークアップ コンパイルされていない XAML に対してのみ使用できます。マークアップ コンパイルされた XAML および XAML の BAML 形式は、現在、XAML 2009 言語のキーワードと機能をサポートしていません。ルース XAML を WPF に読み込むための既存の手法にも、CLR 型および型システムに対するセキュリティおよびアクセス制限があり、マークアップ コンパイル済み XAML よりも制限が厳しいことに注意してください。詳細については、「セキュリティ (WPF)」または「WPF セキュリティ戦略 - プラットフォーム セキュリティ」を参照してください。XAML 2009 では、以前の XAML 2006 構造を変更するか、基本的なマークアップ フォームを変更する追加機能も導入されています。
x:Reference is a construct defined in XAML 2009. WPF では、XAML 2009 の機能を使用できますが、WPF マークアップ コンパイルされていない XAML に対してのみ使用できます。マークアップ コンパイルされた XAML および XAML の BAML 形式は、現在、XAML 2009 言語のキーワードと機能をサポートしていません。
ただし、次の段落は、前の段落 (つまり、についての段落) の直前に表示されますx:Reference
。
WPF および XAML 2006 では、要素の参照は、ElementName バインディングのフレームワーク レベルの機能によって処理されます。ほとんどの WPF アプリケーションとシナリオでは、ElementName バインディングを引き続き使用する必要があります。この一般的なガイダンスの例外には、データ コンテキストやその他のスコープに関する考慮事項があり、データ バインディングが非現実的であり、マークアップ コンパイルが関与しない場合が含まれる場合があります。
ここに直接の矛盾はありませんが、この段落はx:Reference
アプリケーションで使用できると言っているようです。また、その段落についてx:Reference
は自動的に生成されたようで、古くなっている可能性があります。
次に、本「WPF 4 Unleashed」からの抜粋を次に示します。
x:Reference マークアップ拡張機能は、多くの場合、この記事の執筆時点ではルース XAML からのみ使用できる XAML2009 機能に誤って関連付けられています。x:Reference は WPF 4 の新機能ですが、プロジェクトがバージョン 4 以降の .NET Framework を対象としている限り、XAML2006 から問題なく使用できます。
次の Stackoverflow の質問もありますが、答えが矛盾しているものもあり、明らかに正しいものはありません。
- x:Reference の代わりになるものは何ですか?
- XAML 2009 - x:Reference - これを使用することの欠点はありますか?
- WPF の x:Reference はいつ解決され、XAML 要素の順序が影響するのはなぜですか?
最後に、私はこのx:Reference
拡張機能を個人的に使用しましたが、MSDN の説明に関係なく、WPF アプリケーションで機能しているように見えますが、Visual Studio は、マークアップの null 参照例外など、奇妙なこと (または ReSharper の可能性があります) について不平を言うことがあります。
実際の質問に行くと、
- WPF アプリケーションで XAML 2009 を (全体または一部) 使用できますか?
- これらの特定の拡張機能は、WPF アプリケーションの作成に使用できますか? それらの使用に制限はありますか?
- これらすべてに関して、なぜこれほど多くの混乱が生じているのでしょうか?
c# - MarkupExtension の DesignTime で静的リソース値を取得するにはどうすればよいですか?
独自の MarkupExtension の作成に成功しました 「GtringResource」という名前を付けましたが、うまく機能していますが、デザイン モードでは機能しませんでした。
ProvideValue(IServieProvider ServiceProvider) に次のコードがあります。
実行時に表示される値を返したいのですが、マージされた辞書から値を取得するため、xaml のようになります。
私はこれを試しましたが、役に立ちません:
c# - MarkupExtension 宣言のデフォルト コンストラクタ パラメータ
この質問を最小限に減らして、この MarkupExtension クラスを検討してください...
この Xaml が宣言されると...
...期待どおり、TextBlock に「 helloworld 」が表示されます。ここまでは順調です。
しかし、コンストラクターのパラメーターをこれに変更します...
...そしてこれに関連するXaml...
結果のエラーメッセージは...
このステートメントをクラスに追加してコンストラクターをチェーンするという回避策があります...
これにより、TextBlock に「 hellonot provided 」が表示されます。ただし、これは MarkupExtension のセマンティクスも変更するため、より大きな「現実世界」のケースでは望ましくありません。また、より複雑な型が使用されているか、コンストラクターの引数が「動的」型である場合、オーバーロードの複雑さは劇的に増加します。また、たとえば、新しい「発信者情報」属性の使用は完全にブロックされます。
問題は、Xaml パーサーが既定のコンストラクター引数を受け入れるように Xaml を宣言する方法です。
c# - カスタム MarkupExtension は、設計時にのみ TypeInitializationException を引き起こします
私は、役割が単純なカスタム マークアップ拡張機能に取り組んでいます。
拡張コンストラクター パラメーター (型) で System.Activator を使用し、インスタンス化します。
ランタイム中、この拡張機能は期待どおりに機能します。
ただし、設計時には、型をアクティブ化するときに例外がスローされます。
ソースを見つけるためにドリルダウンし、クジラを捕まえました。
だから私はこれをループしました:
そして、次のメッセージを取得しました
Windows ランタイム タイプ 'Windows.ApplicationModel.Core.IFrameworkView' が見つかりませんでした。
Windows ランタイム タイプ 'Windows.ApplicationModel.Core.IFrameworkViewSource' が見つかりませんでした。
私のコードは実行時に正常に動作するため、私の唯一の推測は、VS (.NET 4.5.1 の 2013 update 2)
または、Xaml デザイナーが間違ったアセンブリを探しているだけです。
これを修正する方法についてのアイデア、またはこの問題に対する他の見解はありますか?
お時間を割いていただき、誠にありがとうございました。
xaml - Windows ストア アプリの MarkupExtension をどのように置き換えますか?
Microsoft は、Windows ストア アプリの MarkupExtension クラスを完全に廃止したようです。これは、(特に) x:Static がなくなったことを意味します。それに代わるものはありますか?そうでない場合、なぜですか?XAML で静的メンバーを提供するための新しい手法は何ですか (たとえば、Bindings の ConverterParameters として)?
c# - マークアップ拡張機能付きの文字列形式
string.Format
コード ビハインドのボイラープレートなしで、さまざまなテキスト部分を純粋な XAML で結合できるように、WPF で便利な関数として利用できるようにしようとしています。主な問題は、関数への引数が他のネストされたマークアップ拡張機能 ( などBinding
) から来ている場合のサポートです。
実際、私が必要としているものに非常に近い機能があります: MultiBinding
. 残念ながら、bindingsのみを受け入れることができますが、 のような他の動的なタイプのコンテンツは受け入れることができませんDynamicResource
。
すべてのデータ ソースがバインディングである場合、次のようなマークアップを使用できます。
の明らかな実装でStringFormatConveter
。
構文が次のようになるように、カスタム マークアップ拡張機能を実装しようとしました。
または多分ただ
ProvideValue(IServiceProvider serviceProvider)
しかし、引数が別のマークアップ拡張である場合の for の実装に行き詰まっています。
インターネット上のほとんどの例は非常に些細なものです: それらはまったく使用しないか、(ほとんどの場合) マークアップ拡張機能のターゲットである依存関係プロパティを示すserviceProvider
query を使用します。IProvideValueTarget
いずれにせよ、コードは呼び出し時に提供されるべき値を知っていProvideValue
ます。ただし、ProvideValue
一度だけ呼び出されるため (別のストーリーであるtemplates を除くBinding
)、実際の値が一定でない場合 (forなど) は別の戦略を使用する必要があります。
Binding
Reflector での実装を調べたところ、そのProvideValue
メソッドは実際には実際のターゲット オブジェクトではなく、System.Windows.Data.BindingExpression
すべての実際の作業を行っているように見えるクラスのインスタンスを返します。についても同じですDynamicResource
。 のインスタンスを返すだけでSystem.Windows.ResourceReferenceExpression
、(内部)へのサブスクライブとInheritanceContextChanged
、適切な場合の値の無効化を考慮しています。ただし、コードを見て理解できなかったのは次のとおりです。
BindingExpression
タイプ/のオブジェクトがResourceReferenceExpression
「そのまま」扱われず、基礎となる値を要求されるのはどうしてですか?- 基礎となるバインディングの値が変更されたことをどのように
MultiBindingExpression
知るので、その値も無効にする必要がありますか?
文字列の連結をサポートすると主張するマークアップ拡張ライブラリの実装を実際に見つけました(これは私のユースケースに完全にマッピングされています)(project、code、他のコードに依存する連結の実装)が、ネストされた拡張機能のみをサポートしているようですライブラリの種類 (つまり、バニラを内部にネストすることはできません)。Binding
質問の上部に示されている構文を実装する方法はありますか? サポートされているシナリオですか、それとも WPF フレームワーク内からのみ実行できますか (System.Windows.Expression
内部コンストラクターがあるため)。
実際には、カスタムの非表示のヘルパー UI 要素を使用して、必要なセマンティクスを実装しています。
( where はFormatHelper
その子とその依存関係のプロパティの更新を追跡し、最新の結果を に格納しValue
ます) ですが、この構文は醜いようで、ビジュアル ツリーでヘルパー アイテムを削除したいと考えています。
最終的な目標は、翻訳を容易にすることです。「爆発まで 15 秒」などの UI 文字列は、ローカライズ可能な形式「{0} 爆発まで」(ResourceDictionary
言語が変更されると置き換えられます) およびBinding
VM の依存関係として自然に表されます。時間を表すプロパティ。
更新レポート: インターネットで見つけたすべての情報を使用して、マークアップ拡張機能を自分で実装しようとしました。完全な実装はこちら ( [1]、[2]、[3] ) で、コア部分は次のとおりです。
これはネストされたバインディングと動的リソースで機能するようですが、istargetObj
から取得したこの場合のように、それ自体をネストしようとすると惨めに失敗します。ネストされたバインディングを外側のバインディング ( [1a]、[2a] )にマージしてこれを回避しようとしました(マルチバインディング スピルを外側のバインディングに追加)。動的リソース。IProvideValueTarget
null
興味深いことに、さまざまな種類のマークアップ拡張機能をネストすると、外側の拡張機能で と が取得Binding
さMultiBinding
れますがResourceReferenceExpression
、DynamicResourceExtension
. なぜ矛盾しているのだろうか(そして からどのようにBinding
再構築されるのかBindingExpression
)。
更新レポート: 残念ながら、回答で与えられたアイデアは問題の解決策にはなりませんでした。おそらく、マークアップ拡張機能は非常に強力で用途の広いツールですが、WPF チームがもっと注意を払う必要があることを証明しています。
とにかく、議論に参加してくれたすべての人に感謝します。提示された部分的な解決策は、より多くの賛成票に値するほど複雑です。
更新レポート: マークアップ拡張機能を使用した適切なソリューションがないように思われるか、少なくともそれを作成するために必要な WPF の知識のレベルが深すぎて実用的ではありません。
ただし、@adabyron には、ホスト項目のヘルパー要素を非表示にするのに役立つ改善のアイデアがありました (ただし、これの価格はホストのサブクラス化です)。サブクラス化を取り除くことが可能かどうかを確認してみます (ホストの LogicalChildren をハイジャックし、ヘルパー要素を追加する動作を使用して、同じ回答の古いバージョンに触発されて頭に浮かびます)。
c# - プログラムで動的リソースを設定しますが、ResourceDictionary が変更されたときに FrameWorkElement が更新されませんか?
GUI要素を翻訳するために動的リソース辞書を使用しています。辞書は起動時に読み込まれるか、実行時に変更される可能性があります。非常にうまく機能します!
今、プログラムでいくつかの GUI 要素を追加する必要があります..しかし、翻訳を変更した後、それらは更新されません..
XAML で GUI 要素を「変換」する方法は次のとおりです。
これは、ListBox に追加される MenuItem クラスです。
これは、ListBox の XAML スタイルです。
XAML で次のように使用される ListBox:
起動後、MenuItems は正しい翻訳を持っているので、参照は機能しますか?! しかし、実行時に言語を変更すると、MenuItems だけが古い言語を表示します!
ボタンをプログラムで追加し、その ReferenceSource を DynamicResource に設定すると、その内容も実行時に変更されます!
しかし、私のMenuItemsは実行時に変更されません??!
どんな助けでも大歓迎です!
wpf - カスタム DataTemplate プロパティのカスタム マークアップ拡張
datatemplate から派生した型のカスタム プロパティでカスタム マークアップ拡張機能を使用する方法があるかどうか疑問に思っています。
DataTemplates 内に追加情報が必要です。
DataType プロパティにCommonShape
markupextension を設定すると、すべてが機能します。x:Type
Geometry プロパティに markupextensionを配置すると、すべてが機能します。
しかし、カスタム プロパティにカスタム マークアップ拡張機能を追加すると、エラーが発生します。
これに対する回避策はありますか?
アレックス
編集: 考えられる回避策の 1 つは、マークアップ拡張機能の値をリソース ディクショナリに入れ、Geometry プロパティで StaticResource を使用することです。ただし、xaml を使用してこれが可能かどうかはわかりません。