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

0 投票
2 回答
4310 浏览

c# - Possible to clear an adorner layer?

I might be misunderstanding the concept of adorner layers in WPF but I've managed to add a TextBlock to a StackPanel's adorner layer.

How would I clear an adorner layer? So the StackPanel no longer has a TextBlock in it's adorner layer for example?

0 投票
2 回答
726 浏览

c# - 从 AdornerLayout 或 Adorner 或装饰控件访问 AdornerPanel?

我正在尝试添加一个简单的 Textblock 作为控件的装饰。但我希望它位于我的装饰控制之上。

这是装饰创建(问题不依赖于此代码):

我无法做到的是装​​饰的定位,在装饰的控制之上。我想使用这个 MSDN 代码示例,它利用 AdornerPanel 来进行定位...

但是,我还没有弄清楚如何访问 AdornerPanel 对象以应用此 MSDN 代码示例......既不是来自我的装饰控件,来自 AdornedLayout,也不是来自 Adorner ......

我承认我不清楚 AdornerPanel 和 AdornerLayout 之间的 WPF 类层次结构。

任何帮助表示赞赏。

0 投票
1 回答
1314 浏览

wpf - 你能有一个超出装饰控件范围的装饰器吗?

我们有一个控件,它显示一个小的视觉效果,但我们需要显示一个大的错误消息。我们显示了验证模板,但它似乎被裁剪到装饰控件的边界。有什么简单的方法可以让装饰的价值在此之外呈现出来吗?

0 投票
3 回答
2473 浏览

wpf - 使用超过 144 个装饰器

看起来,可以正常工作且没有任何破损的装饰器的最大数量是 144。

我有一个带有一堆对象的 ScrollView,其中许多都带有装饰器。前 144 个装饰器的位置正确,但其余的则不正确。请注意,当有这么多时,这是一种例外情况;通常,装饰者恰好为零。尽管如此,即使在那个特殊的场合,我也希望它能够正常工作。

撇开这个任意(而且非常低)的限制让我感觉如何,是否有任何实际的解决方法来解决这个错误?

0 投票
3 回答
2749 浏览

c# - 当 HasError 为 false 时,验证错误修饰未清除

介绍

我创建了一个DecimalTextBox用户控件,它ValidationRule附加了 s 以防止空值,具有最小和最大范围,并且它具有事件处理程序以防止非十进制值。我用过

在绑定上,因为我希望立即激活验证(并且在最小值和最大值发生变化但没有重新评估验证之前我遇到了一个问题)。

我所做的 null 验证取决于“AllowNull”依赖属性的值:如果控件指定 true,则即使值为 null,该控件也是有效的。如果为 false,则不允许为 null。该属性的默认值为False


问题

true在某个 UserControl 中使用它时,我将 AllowNull 设置为。不幸的是,由于ValidatesOnTargetUpdated设置为true,因此在 xaml 将 AllowNull 设置为 之前验证了控件true,而它仍处于默认false设置。

这会在加载之前导致错误,因为与文本的绑定TextBox还没有解决,所以在加载之前它不允许为空,并且文本的值为空。

这一切都很好而且很花哨,因为在加载后使用新的 AllowNull 值(为真)重新评估验证并删除错误。

然而,红色的验证装饰仍然存在。不完全确定如何摆脱它。


代码 文本框用户控件的 xaml:


控件背后的代码:


和验证规则(#注意:它们在 ValidationRules 命名空间内):

使用了 FrameworkElement 绑定,因此我的 ValidationRules 可以具有要绑定的依赖项属性。这允许我在控件之外指定最小值和最大值。


概括

我已经通过在加载后HasError使用Validation.GetHasError(DecimalBox)(对于控件本身以及它的内部)进行了检查,它产生了错误。TextBox

我知道如果我删除ValidatesOnTargetUpdated="True"红色不会出现,但我需要它。那么为什么验证被重新评估但红色边框装饰没有消失呢?

我对 Validation 类或其静态方法知之甚少,但那里有什么东西可以去除装饰。ClearInvalid 方法无济于事,因为我没有错误来提供它。

有任何想法吗?

u_u


编辑

我做了一些更多的调查,发现了以下几点:

  1. 如果我在加载后将文本更改为大于最大值然后将其改回错误装饰器消失
  2. 如果我以编程方式将控件加载事件中的 Text 依赖属性的值更改为大于最大值并将其更改回来,则装饰器仍然存在
  3. 如果我在加载后将文本更改为空值,然后将其改回,则装饰器仍然存在
  4. 如果我在视图模型的构造函数中更改绑定到文本的视图模型属性的值,装饰器仍然存在
  5. 如果我将绑定到视图模型的构造函数内的文本的视图模型属性的值更改为大于最大值的值,然后将其更改回来,装饰器仍然存在
  6. 如果我使用按钮将绑定到文本的视图模型属性的值更改为不同的值,然后将其更改回来,装饰器就会消失
  7. 如果我使用按钮将绑定到文本的视图模型属性的值更改为大于最大值的值,然后将其更改回来,装饰器就会消失

我仍然相当难过。我尝试过类似的方法,UpdateLayout()并尝试将装饰器移动到不同的控件并使用Validation.SetValidationAdornerSite. 我一直在努力,但我真的不知道该怎么做。

u_u


第二次编辑

好的,我在此期间所做的是在 TextBox 周围放置一个 AdornerDecorator,然后在文本框加载事件中将最大值更改为 1,将值更改为 2,然后将其更改回来以使文本框刷新。

这是可行的,但我讨厌这个想法,因为它的代码很糟糕。

然而,这种解决方案不再可行。我有一些代码正在对绑定到这些 DecimalTextBox 之一的属性之一的属性进行更改。然后因为在加载事件中属性被更改和更改回来,其他代码也在运行并导致错误。我必须找到一个更好的解决方案然后这个。

有谁知道如何刷新验证装饰器?

u_u

0 投票
3 回答
1616 浏览

c# - WPF中的错误?当 FlowDirection 为 RightToLeft 时 Adorner 内的 TextBlock 显示反文本

我正在使用装饰器在我的文本框中显示水印。但是当我将窗口的 F​​lowDirection 设置为 RightToLeft 时,装饰器内的文本(即文本块)是相反的!!!

这是一个错误还是我应该改变一些东西?

在此处输入图像描述

这是装饰器的完整代码:

我用它:

提前致谢 :)

0 投票
2 回答
2529 浏览

c# - 如何创建不使用 AdornedElement 缩放的装饰器?

很简单,我想创建一些调整大小/重新缩放装饰器以附加到 FrameworkElement,如果他们正常使用装饰器,则允许用户调整元素大小,如果他们使用底部,则允许他们重新缩放元素(不一定一致) - 右装饰并在这样做的同时按住 SHIFT 按钮。

我尝试了各种方法来实现这一点,但我总是以装饰器本身被缩放,所以它们最终变得巨大,或者有巨大的边界。从那以后,我开始使用相对于窗口的位置来定位它们并忽略了应用于 AdornedElement 的 RenderTransform,但是我得到了一些非常不寻常的行为。

首先,当我将元素缩放超过(大约)2 倍时,重新缩放行为会崩溃并开始在整个地方跳跃。

显然,这种行为比描述更容易看到,因此我附上了一个示例解决方案(VS 2010)来演示问题和导致它的代码。

示例 VS 2010 解决方案

如果有人可以给我任何正确方向的指示,请随时告诉我我做错了!哈哈。

另外,请记住,如果底层装饰元素被旋转,这个装饰器最终也必须正确显示,目前它不会。

更新:为了让 NVM 开心,这里是他的解决方案:NVM 的方式

0 投票
2 回答
1704 浏览

wpf - 为什么我的 SurfaceScrollViewer 不能拖动滚动?

我们正在为 Windows 平板电脑编写应用程序。我创建了一个自定义控件,它使用 aSurfaceScrollViewer在窗口右侧呈现一个垂直且可滚动的列表。该控件使用 Adorner 将自身添加到 Window 的装饰层,以便可以在窗口内容的顶部呈现它。

它工作得非常好,但表面滚动查看器只能通过鼠标滚轮或滚动条滚动。我希望能够隐藏滚动条并依靠用户通过触摸拖动列表,但这无法正常工作。我们已经SurfaceScrollViewer在这个项目的其他地方使用了控件,并且效果很好,所以我猜这个问题取决于控件是如何构建的,或者可能是因为它位于 AdornerLayer 中?与 Surface 注册触摸有关吗?奇怪的是SurfaceButton列表中的控件工作正常。

任何帮助或建议将不胜感激。这基本上是自定义控件。我已经删除了一些绑定的零碎以减小尺寸,并且我添加了周围的 Window/AdornerLayer/Adorner 元素以将其置于上下文中。

编辑- 装饰器实际上被添加到 Grid 的装饰器层,它是 Window 的子级。我已经更新了下面的 XAML。

0 投票
1 回答
2039 浏览

wpf - 装饰师没有出现

我正在使用包含 Canvas 的 UserControl。作为画布的孩子,有装饰器的内容控制。为什么装饰器是不可见的,也许装饰器层是ceated。一切都是创建和附加的。装饰层在视觉树中非常高。装饰层放置在 UserControl 之外。

我知道这是因为我实现了有效的基本运动机制,但装饰器从未出现过。

必须做什么才能向装饰者展示?

0 投票
1 回答
731 浏览

wpf - 在 ScrollViewer 可滚动区域中包含 Adorner

我目前有一个Adorner内部的ScrollViewer. 滚动查看器底部的对象有时会在其下方显示一个大装饰器。不幸的是,该装饰器不包含在ExtentHeight滚动查看器中,因此装饰器的下部被滚动查看器视口的底部剪裁。

有没有办法让装饰层的内容包含在滚动查看器的可滚动区域中?