問題タブ [adorner]
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# - 「オブジェクトを機能的に装飾する」ための最良の方法は何ですか?
ファクトリがオブジェクトに機能をパックできるようにする以下の例を作成しましたが、問題は機能がオブジェクトから切り離されていることです。
私の最終的な目標は、log、save、displayなどのアタッチ機能で、それぞれの異なるオブジェクトが持つ特定のプロパティを操作することです。
オブジェクトのデータをデータベースに保存する「保存」や、そのアクティビティをログに記録する「ログ」などの機能を有効にしながら、この例の外観を装飾する側面を維持するにはどうすればよいでしょうか?
.net - 一部の装飾者を通過させる AdornerDecorator ?
質問: 必要なsAdornerDecorator
だけを取るを作成することは可能ですか?Adorner
AdornerLayer
AdornerDecorator
内に追加してTextBox
、そのレイヤー内にその装飾を配置するにはどうすればよいですか? もちろん、動作の中で、デザイナーは装飾を持つすべてのAdornerDecorator
要素を追加することを気にするべきではありません...
できれば、この装飾者だけがそこに行き、他のすべての装飾者を盗むべきではありません。
装飾者を作成するときに、装飾者がどのレイヤーに表示されるかを予測することはできません...
あなたが作成しAdornerDecorator
ない限り。それでおしまい!それらがどのレイヤーに表示されるかを事前に知ることはできません。それらはそのように機能するように設計されていません。これにより、全体が単なる苦痛になります。
でのみ機能TextBox
する adorner を作成していると想像してください。それを機能させ、それに沿って行動するには、あなたの装飾者を上に置いておくTextBox
必要があります.AdornerDecorator
TextBox
AdornerDecorator
飾ろうとしている要素をどのように包むように作成しますか? そうそう、それは adorner の作成中には不可能です (私が知っていることではありません)。- なんとか作成
AdornerDecorator
できたとしても、まだ問題があります。子のすべての装飾を盗み、このレイヤーに置きます。もう一度...なんてこった!私が作成していない場合でも、すべての子要素の装飾者がこのレイヤーに移動する必要があるとどのように想定できますか?
つまり、すべての子要素とその装飾者も明確に把握していない場合、装飾者が表示されるレイヤーを制御する方法はありません。無邪気なスプリンクルを作成するとき、それは非常に多くのことを知っています.
回避策の可能性:
- 必要なことがわかっている adorner のみを取得するスペシャル
AdornerDecorator
を作成し、それ以外は次の「グローバル」AdornerDecorator に渡します。 - どういうわけか、このデコレーターで装飾された要素の内側を装飾者がラップするようにし、このデコレーターのすぐ内側に装飾者を追加します。
私はこの回避策が好きではありませんが、悪い設計上の決定には非常に醜いハックが必要になることがあります...今回はこれが必要だと思います.
wpf - 装飾された要素の祖先にバインドする
ケースは次のとおりです。
つまり、ある要素がadorner内にある場合、BindingのRelativeSourceプロパティを使用して、装飾されたビジュアルツリー内の要素にアクセスすることはできません。
FontSizeをツールチップの所有者FontSizeにバインドする必要があるとき、私はすでにToolTipで同じ問題にぶつかりました-非常に便利なPlacementTargetプロパティがあり、ツリー内を検索する必要はありませんでした-バインドは見えましたこのような:<Binding PlacementTarget.FontSize />
これはほぼ同じ問題です。アイテムがToolBarOverflowPanel内にある場合、それはadorner内にあるように見えるため、RelativeSourceは明らかにバインドに失敗します。
問題は、このトリッキーな問題をどのように解決するかです。私は本当にコンテナのプロパティにバインドする必要があります。飾られた要素に縛ることができたとしても、祖先への道のりはまだまだ長いです。
UPD:最も不幸な副作用は、コマンドが意図したターゲットに到達しないことです-バブリングメカニズムを介したコマンドの伝播は、装飾者のビジュアルルートで停止します:(。明示的なターゲットの指定は同じ問題に遭遇します-ターゲットはlocal:CustomControl
のビジュアルツリー内にある必要があります、同じRelativeSourceバインディングでは到達できません。
UPD2:視覚的および論理的なツリートラバーサル結果の追加:
UPD3:古いトラバーサル結果を削除しました。より正確なトラバーサルを追加しました:
UPD4 :(これが最終的なものであることを願っています)。論理的な親のトラバースされたビジュアルツリー:
前もって感謝します!
wpf - プログラムによる WPF Adorner Visibility Data Binding
その上に渦巻くアイコンを持つ Loading Adorner を作成しています。XAML で可視性プロパティを直接バインドしようとしましたが、実際にはその階層内のすべてが隠されています。
XAMLにこれがあります:
そしてこれは私のコンストラクターで
これは私が望んでいたことではないので、代わりにコードにバインドしてみました:
これは、実際に RootGroup.Loading を見つけることができるため、DataContext が null でない場合に機能します。ただし、null の場合、バインディングには参照するソースがありません。
だから私は、XAML データバインディングがその .Source として何を使用するのか疑問に思っていましたか? XAML で直接バインドすると、正しいプロパティにバインドされますが、同じ結果にはなりません。.Source を何に設定すればよいのか疑問に思っているので、 RootGroup.Loading にバインドできますか?
ありがとう、ラウル
wpf - WPF での親の寸法に対するアドナーの配置
装飾された要素の親の寸法に応じて Adorner を配置しようとしています。たとえば、テキストボックスがあります。このテキストボックスを飾りたいので、次のようになります。
装飾者をどのように配置する必要があるか http://img707.imageshack.us/img707/9840/fig1.png
テキストボックスはキャンバスオブジェクトに配置され、十分なスペースが利用できる場合は、テキストボックスの下端に沿って装飾 (半透明の丸みを帯びた正方形) を配置します。ユーザーがテキストボックスをクリックすると、装飾が開始されます。
現在、キャンバスとそのコンテンツ (テキスト ボックス) は WinForms フォームでホストされているため、WPF は ElementHost コントロールによって処理されます。
しかし、コードを実行すると、テキストボックスが初めてクリックされたときに、テキストボックスの上端に揃えられた装飾が表示されます (下の図を参照)。その後、(上の図のように)正しく配置されます。これがなぜなのか知っている人はいますか?
アドナーの位置 http://img14.imageshack.us/img14/4766/fig2v.png
このコードを以下に貼り付けました。
TextBoxAdorner.cs - これは装飾ロジックです。
wpf - WPFドラッグアンドドロップ中にドラッグアドナーの位置を更新するには?
ドラッグされている要素の「ゴースト」を表示するために装飾者を使用しています...
...しかし、ドラッグ中に装飾の位置を更新する良い方法が見つかりません。私が得た最も近いものはAllowDrop="true"
、最上位のグリッドに設定し、DragOver ハンドラーを与えることです...
しかし、これは、カーソルに関する適切なフィードバックが得られないことを意味します。つまり、実際のドロップ ターゲットに到達するまでではなく、DragDropEffects
常にカーソルが表示されます。DragDropEffects.Move
DragDropEffects.None
装飾者の位置を更新するより良い方法を知っている人はいますか?
wpf - ItemsControl の各項目のオーバーレイを作成する方法は?
私は ItemsControl を装飾して、iPhone UI に多少影響を受けた特定の条件下で、各項目に項目のコンテンツの上に浮かぶ [削除] ボタンがあるようにしようとしています。これにどのようにアプローチできるかについていくつかの方法を念頭に置いていますが、これを行う最善の方法についてより良い考えを持っている可能性のある他のWPFの人々からのガイダンスを使用できます。以下は、私がやろうとしていることを表現するのに役立つモックアップ画像です。
私の現在の考えは、スタイル、テンプレート、および必要に応じて添付されたプロパティのみを使用して、XAML のみを使用してこれを試みることです。アイデアは、項目コントロールの条件付き DataTemplate を作成して、元のコンテンツを [削除] ボタンを含む装飾で何らかの方法でラップすることです。私のItemsControlに状態を持たせて、私が削除モードにあるかどうかを知るために、添付プロパティを作成して、それをの状態にバインドするなど、さまざまな方法で設定できるようにすることを考えています。たとえば、トグル ボタンまたはチェックボックスです。
この時点で概念は理にかなっていますが、ItemTemplate を使用することが最善の方法であるかどうかについては、詳細が少し不明確です。場合によっては、特定の ItemsControl に対して ItemTemplate が既に存在している可能性があり、それを上書きしたくないが代わりにそれをラップしたい(それが理にかなっている場合)。スタイルとおそらく添付プロパティを指定することで、これを任意の項目コントロールに適用できるはずです。
誰かがこれらの詳細を説明するのを手伝ってくれたり、どうすればよいかについてより良い提案を提供してくれたりしたら、共有してください.
c# - C#Windowsフォームの愛好家
WinFormsアプリにキャンバス(パネルコントロール)があり、ユーザーはテキストボックスやラベルなどをドラッグできます。しかし、私は彼らがオブジェクトをより正確に整列させるのをより簡単にしたいのです。私はそれを読みました、そして、Adornersは行く方法であるように思われますか?しかし、どうやらそれはWPF専用です。残念ながら、WPFは私にとってオプションではありません。
私が達成しようとしているのは、ユーザーがキャンバス内でオブジェクトをドラッグするたびに線がポップアップするようにすることです...Windowsフォームデザイナビューでの動作と同じです。
助けていただければ幸いです。
ありがとうございました。
wpf - WebBrowser コントロール上に Adorner を表示する
アプリのさまざまなことに System.Windows.Controls.WebBrowser を使用していますが、WebBrowser に表示されるはずの装飾が切り取られていることに気付きました。WebBrowser コントロールは実際には COM コンポーネントのラッパーであり、おそらくレンダリングが異なることを認識していますが、これを解決する方法を誰かが理解しているかどうか疑問に思いました。
これが私が見ている問題です。ここでは、何かの上隅に (サンプルとして) 大きな赤い円を描画することになっているサンプル adorner を示します。
これで WebBrowser を装飾すると、次の結果が得られます。
私は完全な円を見ることを期待しています。
役立つ場合に備えて、この価値のない装飾者のコードを次に示します。
そして、これをホスト コントロールの OnRender メソッドでブラウザーに適用する方法を次に示します。
これに対するハックや回避策はありますか?
編集:それが違いを生む場合、私は.NET 4.0を使用しています。
編集 #2: WebBrowser は HwndHost から継承しているように見えます。これは、アドナーと hwndsources に関する別の質問を 1 つまたは 2 つ見たことがありますが、WebControl に実装できるように見えるものは何も見られませんが、うまくいけば、これは有益な情報です誰か。
wpf - 検証アドナーがアニメーションで完全に消えることはありません
ContentPresenter
デフォルトで高さと幅が0に設定されているを含むWPFウィンドウがあります。ユーザーがボタンをクリックすると、アニメーションを実行してContentPresenterのHeightプロパティとWidthプロパティを896,1024に変換します(実際には、成長中に3回転します)。これはすべて問題ありません...
ユーザーコントロールのDataContextはIDataErrorInfoを実装し、ユーザーが[これらの健康と安全に関する指示を読んで理解しました]チェックボックスをクリックしない場合、チェックボックスの周囲に赤い境界線が表示されます...
私の問題は、ユーザーが[キャンセル]をクリックし、高さと幅を0,0に縮小するアニメーションを実行すると、UserControlが必要に応じて縮小されますが、赤い境界線が完全に消えないことです。ウィンドウの中央にある赤いピクセル
私が間違っていることを誰かが考えていますか?「赤い境界線」は、WPFによってレンダリングされた単なるAdornerであると想定しているため、この動作を変更する方法がわかりません...
すべてが大いに感謝します!
更新-阿部の優れた提案を試しましたが、残念ながらうまくいきませんでしたが、他のことも試してみました...そこで、(一時的に)「縮小」アニメーションをコメントアウトし、可視性を「折りたたみ」に設定しました。 KeyTime = "0:0:0.9" ...キャンセルを押すと、1秒も経たないうちに、UserControlは消えますが、赤い装飾者は頑固に残ります:(
追加の情報として(関連するかどうかわからない場合)、ContentPresenterに表示されるUserControlには、UserControlをレンダリングするためのContentPresenterと、検証装飾を含む内部コンテンツも含まれています...
コードサンプル:
ありがとう、イアン