问题标签 [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?
基本上,在我的过程中,MeasureOverride
我想检查我的子元素是否设置了某个属性,无论它是什么类型的项目。
如何以一种方式做到这一点,以确保孩子拥有可用的财产,然后获得它的价值?问题是 UIElement 没有 IsSelected 属性,面板可以接受任何支持该属性的子元素,所以我不能只转换为特定类型......
好吧,我正在研究两种可能的情况:
1) 孩子没有将自己添加为Selector.IsSelected
DependencyProperty 的所有者,在这种情况下,孩子会被完全忽略。2)孩子确实将自己添加为Selector.IsSelected
DependencyProperty 的所有者,在这种情况下,我想要那个值。
基本上,我想要 IsSelected 值,同时还防止我的应用程序崩溃,以防没有与该子元素关联的值。
c# - Silverlight 4.0 中的 FrameworkElement 子类化 - 衡量通过问题
我目前在 Silverlight 中有一个问题,我想检测元素大小的变化,并对其做出反应。然而,听.SizeChanged
实际上是不够的,因为在.SizeChanged
调用中的功能之前,我经常会在它改变的大小处得到一个元素的闪光。所以我可能有两个问题。
我的目的是在视觉上改变大小之前使用 Measure pass 来计算我想要应用的操作,这样我就可以消除这种闪烁效果。据我所知,成功执行此操作的唯一方法是创建一个 UIElement,该 UIElement 在测量其余这些元素之前在 Measure 通道上执行这些计算。
因此,我希望通过扩展 FrameworkElement 来创建一个非常轻量级的 UIElement。 但是,我不能让愚蠢的东西显示任何东西。我的印象是,在 FrameworkElement 级别,子类需要将内容添加到 VisualTree,我似乎无法弄清楚如何做到这一点。
我希望避免扩展UserControl
,或者Panel
,因为它们比我需要的要重得多,所以有很多我不想要的额外功能。我只想赶上 Measure 通过并在那里执行一些工作。
那么,是否可以FrameworkElement
在 Silverlight 4.0 中扩展并实际渲染一些东西?如果没有,是否可以通过另一种方式监听/中断测量传递?
.net - 在多个 PropertyChanged 通知后多次调用 WPF MeasureOverride
在我的应用程序中,我有一个带有 Wpf 控件作为元素的图形(自定义 Wpf 面板)。这些元素是从 Wpf Control 派生的自定义控件。DataTemplate 将控件与它们的视图模型相关联。视图模型集合“GraphElements”绑定到 itemsControl,如下所示。
图表中的元素可以从 2 到 500 不等。在应用程序的某些模式下,元素显示它们的值。要显示该值,该元素的 ViewModel 会触发INotifyPropertyChanged.PropertyChanged("VariableValue")
问题: 当图表中有 100 多个元素时,每个元素视图模型都会触发 INotifyPropertyChanged.PropertyChanged 以显示元素值。这会调用 MeasureOverride 100 多次,从而导致内存和性能问题。
如何减少 MeasureOverride 调用的数量?
用于图形元素的值显示的 XAML:
如果 VariableValue 为 null,则折叠上面的 TextBlock
更新:该问题可在下面给出的链接的示例中重现。下载、构建、调试。打开 App 后,在 Window.xaml.cs MeasureOverride 中设置断点。回到应用程序并点击“点击我”按钮。断点被击中 11 次!
http://sivainfotech.co.uk/measureoverrideissue.zip
任何想法都非常感谢。
wpf - 如何仅更改子类中 DependencyProperty 元数据的一个选项?
我们需要DependencyProperty
为我们的子类覆盖 a 的元数据。现在我知道我可以使用OverrideMetadata
和指定全新的FrameworkPropertyMetadata
对象,但在大多数情况下,我希望这个新元数据与现有元数据完全相同,除了设置了一个额外的标志(特别是AffectsMeasure
)
我的想法是获取现有的元数据,创建一个新的元数据对象,将所有成员从旧的手动复制到新的(它不支持Clone
)更改我想要的,然后在 OverrideMetadata 调用中使用新的. 但是 da** 对于原本如此简单的事情来说,这是很多工作!
我在这里错过了什么吗?
编辑
首先,我的意思AffectsMeasure
不是AffectsRender
(我在上面已经改变了),
但是...我刚刚发现我们的班级已经为该属性设置了AffectsMeasure
标志。Width
真正的问题是对于 a ListBox
(例如 a ListBoxItem
)的容器,它MeasureOverride
在第一次初始化时只被调用一次。
由于这在技术上是一个不相关的问题,我将开始一个新问题并关闭这个问题。
这是新问题的链接:
wpf - 为什么 ListBoxItem 在宽度改变时不调用 MeasureOverride?
好的,为了说明的目的,下面我创建了一个 的子类ListBoxItem
和 的一个子类,它通过覆盖和ListBox
来使用它作为它的容器。IsItemItsOwnContainerOverride
GetContainerForItemOverride
现在,当窗口首次出现时,正如预期的那样,MeasureOverride
在每个ListBoxItem
(使用 Infinity,Infinity)ArrangeOverride
上调用,然后在每个项目上调用。
但是,当调整ListBox
, only的大小时,不会ArrangeOverride
调用,即使 width 属性的元数据设置为。ListBoxItem
MeasureOverride
AffectsMeasure
注意:我知道我可以通过设置
ScrollViewer.HorizontalScrollbarVisibility
为“禁用”来解决这个问题,在这种情况下MeasureOverride
会按预期调用,因为滚动设置会强制项目与列表框的宽度匹配,因此自然会重新触发。但是,我仍在试图弄清楚为什么默认情况下不调用 Measure,因为Width
属性的元数据AffectsMeasure
设置了标志,并且宽度正在通过ArrangeOverride
步骤发生变化。
该标志是否只是对其容器的提示,并且对于放置在其中的控件,ScrollViewer
它会被忽略吗?我的猜测是,除非您禁用滚动,否则控件有无限的可用区域,因此一旦测量它们,就无需再次重新测量它们。但是禁用水平滚动并且您说宽度不是无限的,因此MeasureOverride
再次调用。但这只是一个猜测,尽管是合乎逻辑的。
这是可以使用的示例代码。创建一个新的 WPF 项目并将其粘贴到窗口的 CodeBehind 中并查看调试输出。接下来,设置 HorizontalScrollbarVisibility 标志,您会看到它确实被调用了。
wpf - FramworkElement 安排不放置子 FramworkElement
我有两个课程[适用于这个问题]。第一个XYAxes2
,扩展FrameworkElement
。它覆盖MeasureOverride
并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 :网格,IScrollInfo { ....IScrollInfo 实现 }
我使用这个网格认为当 ItemsControl 将 PrepareContainerForItemOverride() 时,我可以使用它来将项目拆分为两列。
这个想法是从会议中“采取”的......但我不知道下一步该做什么......我有这样的问题:当我为数据网格覆盖测量和排列时,我在 DataGrid 中设置了项目的位置,但是然后它被称为 PrepareContainerForItemOverride()...然后呢?我应该计算我应该做的行数?但是如果然后我再次调整窗口大小... PrepareContainerForItemOverride() 将不会被调用...
这个问题已经解决了我......如果你们中的一些人有一个线索,请给我一个线索。感谢你们!
wpf - WPF中的布局系统
我想在代码后面手动触发 ItemsControl 的测量/排列布局传递,而无需用户交互。可能吗?如果是,如何?我试过InvalidateMeasure()
,,UpdateLayout()
但没有用。
c# - MeasureOverride 和 ArrangeOverride 没有被调用
我正在使用来自WPFExtensions的 ZoomControl 。源代码在这里。
我用 OnRender 方法添加了装饰器:
使用 ZoomControl xaml:
应用装饰器:
当我拖动图像控件时,我的装饰器没有移动。
我尝试过覆盖 ArrangeOverride 和 MeasureOverride:
但是没有效果。输出窗口中没有任何内容,并且装饰器没有移动。
当我放大时 - 一切都很好。Adorner 会根据图像控件的变化改变它的位置。
问题出在我的代码中还是在 ZoomControl 中?
示例应用程序在这里。
解决方案:
我不得不将我的画布放入 AdornerDecorator:
说明在这里。
c# - 在滚动查看器中填充 Measure/ArrangeOverride
我有一个包含一些图的自定义绘制控件。我把它放在一个滚动查看器中,因为后来我希望能够缩放控件的内容。我希望这个控件有一个特定的最小高度,如果可用的可见空间大于它应该填充空间。然而,使用 MeasureOverride 我只是得到了可用高度的无穷大(因为滚动查看器)。如何在 MeasureOverride 期间获得实际可用的可见空间以将控件拉伸到此高度?