問題タブ [measureoverride]
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.
wpf - WPF-子がUIElementsである場合に、子にDependencyPropertyが設定されているかどうかをPanelで確認するにはどうすればよいですか?
基本的に、MeasureOverride
アイテムの種類に関係なく、子要素に特定のプロパティが設定されているかどうかを確認したいと思います。
子供が利用可能なプロパティを持っていることを確認し、その値を取得する方法でこれをどのように行うでしょうか?問題は、UIElementにIsSelectedプロパティがなく、パネルがそのプロパティをサポートするすべての子を受け入れることができるため、特定のタイプにキャストすることはできないということです...
さて、私は2つの可能なシナリオを見ています:
1)子は自分自身をDependencyPropertyの所有者として追加しませんでしたSelector.IsSelected
。この場合、その子は完全に無視されます。2)子はDependencyPropertyの所有者として自分自身を追加しましたSelector.IsSelected
。その場合、私はその値が必要です。
基本的に、IsSelected値が必要ですが、その子要素に関連付けられた値がない場合にアプリがクラッシュするのを防ぎます。
c# - Silverlight4.0でのFrameworkElementのサブクラス化-メジャーパスの質問
現在、Silverlightで、要素のサイズの変更を検出してそれに対応したいという問題があります。ただし、の機能が呼び出される前に、変更するサイズの要素がフラッシュされることが多いため、実際には、で聞くだけで.SizeChanged
は不十分です。.SizeChanged
ですから、おそらく2つの質問があります。
私の意図は、サイズが視覚的に変更される前に、メジャーパスを使用して適用する操作を計算し、このちらつきの影響を排除できるようにすることです。私の知る限り、これを正常に行う唯一の方法は、これらの要素の残りを測定する前に、Measureパスでこれらの計算を行うUIElementを作成することです。
そのため、FrameworkElementを拡張して、非常に軽量なUIElementを作成したいと考えていました。 しかし、私は愚かなことを何も表示することができません。FrameworkElementレベルでは、サブクラスでVisualTreeにコンテンツを追加する必要があり、その方法を理解できないようです。
私は、必要なものよりもはるかに重いので、拡張することを避けたいと思っていましUserControl
た。Panel
メジャーパスをキャッチして、そこで作業を実行したいだけです。
FrameworkElement
では、 Silverlight 4.0で拡張して、実際に何かをレンダリングすることは可能ですか?そうでない場合、別の方法でメジャーパスをリッスン/中断することは可能ですか?
.net - 複数のPropertyChanged通知の後、WPF MeasureOverrideが複数回呼び出されました
私のアプリケーションには、要素として Wpf コントロールを含むグラフ (カスタム Wpf パネル) があります。要素は、Wpf コントロールから派生したカスタム コントロールです。DataTemplate は、コントロールをビュー モデルに関連付けます。ビュー モデル コレクション「GraphElements」は、以下に示すように itemsControl にバインドされます。
グラフの要素は 2 ~ 500 の範囲で変化します。アプリケーションの特定のモードでは、要素の値が表示されます。値を表示するために、要素の ViewModel はINotifyPropertyChanged.PropertyChanged("VariableValue")
問題: グラフに 100 個以上の要素がある場合、各要素ビュー モデルは INotifyPropertyChanged.PropertyChanged を起動して、要素の値を表示します。これにより、MeasureOverride が 100 回以上呼び出され、メモリとパフォーマンスの問題が発生します。
MeasureOverride 呼び出しの数を減らすにはどうすればよいですか?
グラフ要素の値表示の XAML:
VariableValue が null の場合、上記の TextBlock は折りたたまれます
更新:この問題は、以下のリンクのサンプルで再現可能です。ダウンロード、ビルド、デバッグ。アプリが開いたら、Window.xaml.cs MeasureOverride にブレークポイントを設定します。アプリに戻り、「Click Me」ボタンを押します。ブレークポイントは 11 回ヒットします。
http://sivainfotech.co.uk/measureoverrideissue.zip
どんなアイデアでも大歓迎です。
wpf - サブクラス内のDependencyPropertyのメタデータの1つのオプションのみを変更するにはどうすればよいですか?
DependencyProperty
サブクラスののメタデータをオーバーライドする必要があります。OverrideMetadata
これで、まったく新しいオブジェクトを使用および指定できることがわかりFrameworkPropertyMetadata
ましたが、ほとんどの場合、この新しいメタデータは、1つの追加のフラグが設定されていることを除いて、既存のメタデータとまったく同じである必要があります(具体的にはAffectsMeasure
)
私の考えは、既存のメタデータを取得し、新しいメタデータオブジェクトを作成し、すべてのメンバーを古いものから新しいものに手動でコピーして(サポートしていませんClone
)、必要なものを変更してから、OverrideMetadata呼び出しで新しいものを使用することです。 。しかし、da **は、他の点では非常に単純なものにとっては多くの作業です。
ここで何かが足りませんか?
編集
まず最初に、私は(上記で変更した)ではAffectsMeasure
ないことを意味しました、AffectsRender
しかし...私はちょうど私たちのクラスがすでにプロパティにAffectsMeasure
フラグを設定していることを知りました。本当の問題は、 (たとえば)のWidth
コンテナの場合、最初に初期化されたときに1回だけ呼び出されることです。ListBox
ListBoxItem
MeasureOverride
これは技術的には無関係な質問なので、新しい質問を開始して閉じます。
新しい質問へのリンクは次のとおりです。
wpf - 幅が変更されたときに ListBoxItem が MeasureOverride を呼び出さないのはなぜですか?
分かりやすく説明するために、以下では、と の両方をオーバーライドしてListBoxItem
、 のサブクラスと のサブクラスを作成ListBox
し、コンテナとしてそれを使用しています。IsItemItsOwnContainerOverride
GetContainerForItemOverride
ウィンドウが最初に表示されると、予想どおり、MeasureOverride
( ListBoxItem
Infinity,Infinity を使用して)ArrangeOverride
すべてのアイテムで呼び出され、その後すべてのアイテムで呼び出されます。
ただし、 のサイズを変更する場合、 width プロパティのメタデータが に設定されていても、ListBox
のみArrangeOverride
が呼び出されます。ListBoxItem
MeasureOverride
AffectsMeasure
注:
ScrollViewer.HorizontalScrollbarVisibility
「無効」に設定することでこれを回避できることはわかってMeasureOverride
います。この場合、スクロール設定によりアイテムがリストボックスの幅に一致するように強制され、自然に再起動されるため、期待どおりに呼び出されます。Width
ただし、プロパティのメタデータにAffectsMeasure
フラグが設定されており、ステップによって幅が変化しているため、デフォルトで Measure が呼び出されない理由をまだ理解しようとしていますArrangeOverride
。
そのフラグはコンテナの単なるヒントであり、コントロールが配置されている場合はScrollViewer
無視されますか? 私の推測では、スクロールを無効にしない限り、コントロールは無限の領域を使用できるため、一度測定すると、再度測定する必要はありません。ただし、水平スクロールを無効にすると、幅が無制限ではないため、MeasureOverride
が再度呼び出されます。しかし、それは論理的なものではありますが、単なる推測です。
ここで遊ぶためのサンプルコードです。新しい WPF プロジェクトを作成し、これをウィンドウの CodeBehind に貼り付けて、デバッグ出力を確認します。次に、HorizontalScrollbarVisibility フラグを設定すると、それが呼び出されることがわかります。
wpf - FramworkElement 子 FramworkElement を配置しない配置
[この質問に該当する] 2 つのクラスがあります。最初の ,XYAxes2
は を拡張しFrameworkElement
ます。オーバーライドMeasureOverride
し、その唯一の子( extends も含む) を目的の位置に配置ArrangeOverride
しようとします。XAxis
FrameworkElement
XYAxes2
(親):
Scale
カスタム描画コンポーネントです。
Scale
(子):
デバッグ時ActualWidth
、この関数では、 で設定された幅ではなく、常に親の幅がArrangeOverride
100 になります。ただし、子は で指定された領域にクリップされArrangeOverride
ます。
これらの関数のいずれかで何か間違ったことをしていますか?
編集:に挿入することによりXAxis.Measure(100,200)
、ArrangeOverride
問題は明らかに修正されます。確かにMeasure
、取り決めが無効になるたびに呼び出す必要はないはずです (これはInvalidateArrange
、暗黙的に を呼び出す必要があることを意味しますInvalidateMeasure
)。この背後にある原因を明らかにできる人はいますか?
誰かが実際に設定されている場所DesiredSize
を知っていますかActualWidth/Height
(明らかに、私のコードでは設定されていません)?
wpf - WPF-IScrollInfoの実装
問題:いくつかのアイテム(たとえば長方形)を持つItemsControlを持つウィンドウ。ウィンドウのMinWidthとMinHeightが設定されています(例:300)。長方形のサイズを変更するときに、長方形に2列で表示するのに十分なスペースがない場合に必要です。また、2列の場合でも、スクロールビューアを表示するのに十分なスペースがありません。
私が試したこと:1。拡張ItemsControlを作成します。
私のItemsControlには、ItemsPanelTemplateとして拡張グリッドがあります。
パブリッククラスMyGrid:Grid、IScrollInfo{....IScrollInfo実装}
私はこのグリッドを使用して、ItemsControlがPrepareContainerForItemOverride()を実行するときに、これを使用してアイテムを2つの列に分割できると考えています。
アイデアは会議から「取得」されます....しかし、次に何をすべきかわかりません...次のような質問があります:データグリッドの測定と配置をオーバーライドするとき、データグリッドでアイテムの位置を設定しますが、それからそれはPrepareContainerForItemOverride()と呼ばれます...それでは何ですか?作成する行数を計算する必要がありますか?しかし、その後、ウィンドウのサイズを再度変更すると、PrepareContainerForItemOverride()は呼び出されません...
この問題は私を超えています...あなたの誰かがそれを持っているなら私に手がかりを教えてください。君たちありがとう!
wpf - WPF のレイアウト システム
ユーザーの操作なしで、コード ビハインドで手動で ItemsControl の Measure/Arrange レイアウト パスをトリガーしたいと考えています。出来ますか?はいの場合、どのように?を試しましたがInvalidateMeasure()
、UpdateLayout()
だめでした。
c# - MeasureOverride と ArrangeOverride は呼び出されません
私は WPFExtensions の ZoomControl を使用しています。ソースコードはこちら.
OnRender メソッドでアドナーを追加しました。
ZoomControl xaml を使用:
アドナーの適用:
イメージ コントロールをドラッグすると、装飾が動きません。
ArrangeOverride と MeasureOverride をオーバーライドしてみました:
しかし、効果はありません。出力ウィンドウには何も表示されず、装飾は動きません。
ズームしているときは、すべて問題ありません。Adorner は、イメージ コントロールの変更に応じてその位置を変更します。
問題は私のコードにありますか、それとも ZoomControl にありますか?
サンプルアプリはこちら.
解決:
キャンバスを AdornerDecorator に配置する必要がありました。
説明はこちらです。
c# - スクロールビューアー内に Measure/ArrangeOverride で埋める
いくつかのプロットを含むカスタム描画コントロールがあります。後でコントロールのコンテンツをズームできるようにしたいので、スクロールビューアーの中に入れました。このコントロールに特定の最小の高さを持たせたいのですが、利用可能な表示スペースがそれよりも大きい場合は、スペースを埋める必要があります。ただし、MeasureOverride を使用すると、使用可能な高さが無限大になります (スクロールビューアーのため)。コントロールをこの高さまで伸ばすために、MeasureOverride 中に実際に利用可能な表示スペースを取得するにはどうすればよいですか?