问题标签 [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.

0 投票
2 回答
347 浏览

wpf - WPF - 当我的孩子是 UIElements 时,如何让我的面板查看是否在我的孩子身上设置了 DependencyProperty?

基本上,在我的过程中,MeasureOverride我想检查我的子元素是否设置了某个属性,无论它是什么类型的项目。

如何以一种方式做到这一点,以确保孩子拥有可用的财产,然后获得它的价值?问题是 UIElement 没有 IsSelected 属性,面板可以接受任何支持该属性的子元素,所以我不能只转换为特定类型......


好吧,我正在研究两种可能的情况:

1) 孩子没有将自己添加为Selector.IsSelectedDependencyProperty 的所有者,在这种情况下,孩子会被完全忽略。2)孩子确实将自己添加为Selector.IsSelectedDependencyProperty 的所有者,在这种情况下,我想要那个值。

基本上,我想要 IsSelected 值,同时还防止我的应用程序崩溃,以防没有与该子元素关联的值。

0 投票
1 回答
433 浏览

c# - Silverlight 4.0 中的 FrameworkElement 子类化 - 衡量通过问题

我目前在 Silverlight 中有一个问题,我想检测元素大小的变化,并对其做出反应。然而,听.SizeChanged实际上是不够的,因为在.SizeChanged调用中的功能之前,我经常会在它改变的大小处得到一个元素的闪光。所以我可能有两个问题。

我的目的是在视觉上改变大小之前使用 Measure pass 来计算我想要应用的操作,这样我就可以消除这种闪烁效果。据我所知,成功执行此操作的唯一方法是创建一个 UIElement,该 UIElement 在测量其余这些元素之前在 Measure 通道上执行这些计算。

因此,我希望通过扩展 FrameworkElement 来创建一个非常轻量级的 UIElement。 但是,我不能让愚蠢的东西显示任何东西。我的印象是,在 FrameworkElement 级别,子类需要将内容添加到 VisualTree,我似乎无法弄清楚如何做到这一点。

我希望避免扩展UserControl,或者Panel,因为它们比我需要的要重得多,所以有很多我不想要的额外功能。我只想赶上 Measure 通过并在那里执行一些工作。

那么,是否可以FrameworkElement在 Silverlight 4.0 中扩展并实际渲染一些东西?如果没有,是否可以通过另一种方式监听/中断测量传递?

0 投票
1 回答
3989 浏览

.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

任何想法都非常感谢。

0 投票
1 回答
651 浏览

wpf - 如何仅更改子类中 DependencyProperty 元数据的一个选项?

我们需要DependencyProperty为我们的子类覆盖 a 的元数据。现在我知道我可以使用OverrideMetadata和指定全新的FrameworkPropertyMetadata对象,但在大多数情况下,我希望这个新元数据与现有元数据完全相同,除了设置了一个额外的标志(特别是AffectsMeasure

我的想法是获取现有的元数据,创建一个新的元数据对象,将所有成员从旧的手动复制到新的(它不支持Clone)更改我想要的,然后在 OverrideMetadata 调用中使用新的. 但是 da** 对于原本如此简单的事情来说,这是很多工作!

我在这里错过了什么吗?

编辑

首先,我的意思AffectsMeasure不是AffectsRender(我在上面已经改变了),

但是...我刚刚发现我们的班级已经为该属性设置了AffectsMeasure标志。Width真正的问题是对于 a ListBox(例如 a ListBoxItem)的容器,它MeasureOverride在第一次初始化时只被调用一次。

由于这在技术上是一个不相关的问题,我将开始一个新问题并关闭这个问题。

这是新问题的链接:

为什么 ListBoxItem 在宽度改变时不调用 MeasureOverride?

0 投票
1 回答
707 浏览

wpf - 为什么 ListBoxItem 在宽度改变时不调用 MeasureOverride?

好的,为了说明的目的,下面我创建了一个 的子类ListBoxItem和 的一个子类,它通过覆盖和ListBox来使用它作为它的容器。IsItemItsOwnContainerOverrideGetContainerForItemOverride

现在,当窗口首次出现时,正如预期的那样,MeasureOverride在每个ListBoxItem(使用 Infinity,Infinity)ArrangeOverride上调用,然后在每个项目上调用。

但是,当调整ListBox, only的大小时,不会ArrangeOverride调用,即使 width 属性的元数据设置为。ListBoxItemMeasureOverrideAffectsMeasure

注意:我知道我可以通过设置ScrollViewer.HorizontalScrollbarVisibility为“禁用”来解决这个问题,在这种情况下MeasureOverride会按预期调用,因为滚动设置会强制项目与列表框的宽度匹配,因此自然会重新触发。但是,我仍在试图弄清楚为什么默认情况下不调用 Measure,因为Width属性的元数据AffectsMeasure设置了标志,并且宽度正在通过ArrangeOverride步骤发生变化。

该标志是否只是对其容器的提示,并且对于放置在其中的控件,ScrollViewer它会被忽略吗?我的猜测是,除非您禁用滚动,否则控件有无限的可用区域,因此一旦测量它们,就无需再次重新测量它们。但是禁用水平滚动并且您说宽度不是无限的,因此MeasureOverride再次调用。但这只是一个猜测,尽管是合乎逻辑的。

这是可以使用的示例代码。创建一个新的 WPF 项目并将其粘贴到窗口的 CodeBehind 中并查看调试输出。接下来,设置 Horizo​​ntalScrollbarVisibility 标志,您会看到它确实被调用了。

0 投票
1 回答
327 浏览

wpf - FramworkElement 安排不放置子 FramworkElement

我有两个课程[适用于这个问题]。第一个XYAxes2,扩展FrameworkElement。它覆盖MeasureOverrideArrangeOverride试图将其唯一的孩子XAxis(也扩展FrameworkElement)放置在所需的位置。

XYAxes2(家长):

Scale是一个自定义绘制的组件。 Scale(孩子):

调试时,ActualWidth在此函数中始终是父级的宽度,而不是ArrangeOverride100 设置的宽度。但是,子级被剪裁到 指定的区域ArrangeOverride

我在这些功能之一中做错了吗?

编辑:通过插入XAxis.Measure(100,200)ArrangeOverride问题显然得到了解决。当然,每次安排无效时都不需要调用Measure(这意味着InvalidateArrange需要隐式调用InvalidateMeasure)。任何人都可以阐明这背后的原因吗?

有谁知道实际设置在哪里DesiredSizeActualWidth/Height显然它们不是由我的代码设置的)?

0 投票
2 回答
2453 浏览

wpf - WPF - IScrollInfo 实现

问题:一个带有 ItemsControl 和一些项目的窗口(比如说矩形)。窗口设置了 MinWidth 和 MinHeight(例如 300),如果矩形没有足够的空间显示以显示在 2 列中,我需要在调整窗口大小时使用它。如果在 2 列中仍然没有足够的空间来显示滚动查看器。

我尝试过: 1. 创建一个扩展的 ItemsControl:

我的 ItemsControl 作为 ItemsPanelTemplate 有一个扩展网格:

公共类 MyGrid :网格,IScrollInfo { ....IScrollInfo 实现 }

我使用这个网格认为当 ItemsControl 将 PrepareContainerForItemOverride() 时,我可以使用它来将项目拆分为两列。

这个想法是从会议中“采取”的......但我不知道下一步该做什么......我有这样的问题:当我为数据网格覆盖测量和排列时,我在 DataGrid 中设置了项目的位置,但是然后它被称为 PrepareContainerForItemOverride()...然后呢?我应该计算我应该做的行数?但是如果然后我再次调整窗口大小... PrepareContainerForItemOverride() 将不会被调用...

这个问题已经解决了我......如果你们中的一些人有一个线索,请给我一个线索。感谢你们!

0 投票
1 回答
656 浏览

wpf - WPF中的布局系统

我想在代码后面手动触发 ItemsControl 的测量/排列布局传递,而无需用户交互。可能吗?如果是,如何?我试过InvalidateMeasure(),,UpdateLayout()但没有用。

0 投票
1 回答
2223 浏览

c# - MeasureOverride 和 ArrangeOverride 没有被调用

我正在使用来自WPFExtensions的 ZoomControl 。源代码在这里

我用 OnRender 方法添加了装饰器:

使用 ZoomControl xaml:

应用装饰器:

当我拖动图像控件时,我的装饰器没有移动。

我尝试过覆盖 ArrangeOverride 和 MeasureOverride:

但是没有效果。输出窗口中没有任何内容,并且装饰器没有移动。

当我放大时 - 一切都很好。Adorner 会根据图像控件的变化改变它的位置。

问题出在我的代码中还是在 ZoomControl 中?

示例应用程序在这里

解决方案:

我不得不将我的画布放入 AdornerDecorator:

说明在这里

0 投票
1 回答
772 浏览

c# - 在滚动查看器中填充 Measure/ArrangeOverride

我有一个包含一些图的自定义绘制控件。我把它放在一个滚动查看器中,因为后来我希望能够缩放控件的内容。我希望这个控件有一个特定的最小高度,如果可用的可见空间大于它应该填充空间。然而,使用 MeasureOverride 我只是得到了可用高度的无穷大(因为滚动查看器)。如何在 MeasureOverride 期间获得实际可用的可见空间以将控件拉伸到此高度?