问题标签 [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 投票
3 回答
308 浏览

c# - “用功能装饰物体”的最佳方式是什么?

我制作了下面的示例,它使工厂能够打包具有功能的对象,但问题是功能与对象分离

我的最终目标是附加功能,例如logsavedisplay,它们对每个不同对象的特定属性进行操作。

我将如何保留此示例的外部装饰方面,但启用诸如将对象数据保存到数据库的“保存”或记录其活动的“日志”之类的功能?

0 投票
0 回答
731 浏览

.net - 让一些装饰者通过的 AdornerDecorator?

问题:是否有可能创建一个AdornerDecorator只需要Adorner我想要的 s 的AdornerLayer

如何AdornerDecorator在 a中添加TextBox,并将该装饰器放在该层中?当然,在行为内部,设计师不应该关心添加所有AdornerDecorator具有装饰器的元素......

最好只有这个装饰器应该去那里,而不是偷走所有其他的装饰器。

在创建装饰器时,您无法预测装饰器出现在哪一层......

除非你创建AdornerDecorator. 而已!您无法提前知道它们出现在哪一层,它们并非设计为以这种方式工作。这让整个事情变得非常痛苦。

想象一下,您正在创建仅适用于TextBox. 为了让它发挥作用并按照你的要求行事,TextBox你需要AdornerDecorator让你的装饰者保持在TextBox.

  1. 你如何创建AdornerDecorator来包装你要装饰的元素?哦,是的,在创建装饰器期间这是不可能的(我不知道)。
  2. 如果您以某种方式设法创建AdornerDecorator,您仍然会遇到问题:它会窃取孩子中的所有装饰器,并放入这一层。再一次...... WTF!我怎么能假设所有的子元素装饰器,即使是我没有创建的,都应该去这一层?

换句话说,如果您不具体了解所有子元素及其装饰器,则无法控制装饰器出现的层。当创造无辜的洒水时,这就是全部的知识。

解决方法的可能性:

  1. 创建只抓取我们知道我们想要的装饰器的特殊 物品,其他的它会放手到下一个“全球”AdornerDecorator。AdornerDecorator
  2. 不知何故,让装饰器用这个装饰器包裹装饰元素的内部,并在这个装饰器中添加我们的装饰器。

我不喜欢这种解决方法,但糟糕的设计决策有时需要非常丑陋的黑客攻击......我认为这次我们需要这个。

0 投票
2 回答
3414 浏览

wpf - 绑定到装饰元素的祖先

情况如下:

一句话:当某个元素在装饰器中时,不能简单地使用 Binding 的 RelativeSource 属性来访问装饰器可视化树中的元素。

当我需要将其 FontSize 绑定到工具提示的所有者 FontSize 时,我已经习惯使用 ToolTip 遇到同样的问题 - 有非常方便的 PlacementTarget 属性,我不需要在树内查找 - 绑定看起来像这样:<Binding PlacementTarget.FontSize />

这是几乎相同的问题 - 当项目在 ToolBarOverflowPanel 内时,它似乎在装饰器内,因此 RelativeSource 显然无法绑定。

问题是:我该如何解决这个棘手的问题?我真的需要绑定到容器的属性。即使我能够绑定到装饰元素,也距离祖先还有很长的路要走。

UPD:最不幸的副作用是命令没有达到预期的目标 - 通过冒泡机制的命令传播在装饰者的视觉根处停止:(。明确目标的规范遇到同样的问题 - 目标必须在local:CustomControl视觉树内,无法通过相同的 RelativeSource 绑定来访问。

UPD2:添加视觉和逻辑树遍历结果:

UPD3:删除了旧的遍历结果。添加了更精确的遍历:

UPD4:(希望这是最终版本)。遍历逻辑父级的可视化树:

提前致谢!

0 投票
1 回答
2394 浏览

wpf - WPF Adorner Visibility Data Binding 以编程方式

我正在创建一个 Loading Adorner,上面有一个旋转图标。我尝试直接在 XAML 中绑定可见性属性,但这实际上隐藏了其层次结构中的所有内容。

我的 XAML 中有这个:

这在我的构造函数中

这不是我想要的,所以我尝试在代码中绑定它:

如果 DataContext 不为空,这将起作用,因为它实际上可以找到 RootGroup.Loading。但如果它为 null,则绑定没有可查看的源。

所以我想知道 XAML 数据绑定使用什么作为它的 .Source ?直接在 XAML 中绑定会绑定到正确的属性,但不会获得相同的结果。所以我只是想知道我应该将我的 .Source 设置为什么所以我可以绑定到 RootGroup.Loading ?

谢谢,劳尔

0 投票
1 回答
6374 浏览

wpf - 在 WPF 中相对于父级尺寸定位装饰器

我正在尝试根据装饰元素的父级尺寸来定位 Adorner。例如,我有一个文本框。我想装饰这个文本框,使它看起来像这样:

如何放置装饰器 http://img707.imageshack.us/img707/9840/fig1.png

文本框放置在画布对象中,如果有足够的可用空间,则将装饰器(半透明圆角正方形)与文本框的底部边缘对齐。当用户单击文本框时启动装饰器。

目前画布及其内容(文本框)托管在 WinForms 表单中 - 因此 WPF 由 ElementHost 控件处理。

但是当我运行我的代码时,当第一次单击文本框时,它会显示与文本框顶部边缘对齐的装饰器(见下图)。之后它会正确定位自己(如上图)有谁知道为什么会这样?

装饰者如何定位 http://img14.imageshack.us/img14/4766/fig2v.png

我在下面粘贴了代码:

TextBoxAdorner.cs - 这是装饰器逻辑

0 投票
3 回答
12308 浏览

wpf - 如何在 WPF 拖放期间更新拖动装饰器的位置?

我正在使用装饰器来显示被拖动元素的“幽灵”......

...但我找不到在拖动过程中更新装饰器位置的好方法。我最接近的是通过设置AllowDrop="true"顶级网格并给它一个 DragOver 处理程序......

但这意味着我没有得到DragDropEffects关于光标的正确反馈,即它总是显示DragDropEffects.Move光标而不是DragDropEffects.None直到我超过实际的放置目标。

有谁知道更新装饰器位置的更好方法?

0 投票
2 回答
1687 浏览

wpf - 如何为 ItemsControl 中的每个项目创建叠加层?

我正在尝试装饰一个 ItemsControl,以便每个项目都有一个 Delete 按钮,该按钮在受 iPhone UI 启发的特定条件下浮动在项目的内容上。我有几种方法可以解决这个问题,但我可以使用其他 WPF 人员的一些指导,他们可能对如何最好地做到这一点有更好的了解。下面是一个模拟图像,以帮助表达我正在尝试做的事情。

样机示例

我目前的想法是尝试通过仅使用样式、模板以及必要时附加的属性仅使用 XAML 来尝试此操作。这个想法是为项目控件创建条件 DataTemplate,它会以某种方式使用包含我的删除按钮的装饰器来包装原始内容。为了在我的 ItemsControl 上有一个状态以知道我是否处于删除模式,我正在考虑创建一个附加属性,然后我可以通过多种方式设置该属性,例如将其绑定到状态例如切换按钮或复选框。

在这一点上,这个概念是有道理的,但细节对我来说有点不清楚是否使用 ItemTemplate 是最好的举动,因为在某些情况下,给定 ItemsControl 的 ItemTemplate 可能已经存在,我不想覆盖它,而是只会想要包装它(如果这有意义的话)。我在想,如果我成功了,我应该可以通过指定样式和附加属性来将其应用于任何项目控件。

如果有人可以帮助说明这些更详细的细节或提供有关我如何进行的更好的建议,请分享。

0 投票
4 回答
2366 浏览

c# - C# Windows 窗体的装饰器

我的 WinForms 应用程序中有一个画布(面板控件),用户可以在其中拖动文本框、标签等内容。但我想让他们更容易更精确地对齐对象。我读过它,装饰器似乎是要走的路?但是,显然它只适用于 WPF。不幸的是,WPF 不是我的选择。

我想要完成的是每次用户在画布中拖动对象时都会弹出线条......它们在 Windows 窗体设计器视图中的工作方式。

我会很感激任何帮助。

谢谢你。

0 投票
4 回答
2347 浏览

wpf - 在 WebBrowser 控件上显示装饰器

我在我的应用程序中使用 System.Windows.Controls.WebBrowser 来处理各种事情,我注意到当装饰器应该出现在 WebBrowser 上时,它们被切断了。我意识到 WebBrowser 控件实际上是一个 COM 组件的包装器,并且可能呈现不同的方式,但我想知道是否有人想出如何解决这个问题。

这是我看到的问题。在这里,我只有一个示例装饰器,它应该在某物的顶角绘制一个大红色圆圈(作为示例)。

当我用这个装饰 WebBrowser 时,我得到了这个结果:

我希望看到完整的圆圈。

这是这个毫无价值的装饰器的代码,以防万一:

以下是我在主机控件的 OnRender 方法中将其应用到浏览器的方法:

有人对此有任何技巧或解决方法吗?

编辑:我正在使用 .NET 4.0,如果这有所作为的话。

编辑#2:WebBrowser 似乎继承自 HwndHost,我已经看到另一个或两个关于装饰器和 hwndsources 的问题,但我没有看到任何看起来我可以为 WebControl 实现它的东西,但希望这是有用的信息某人。

0 投票
1 回答
994 浏览

wpf - 验证装饰器不会在动画中完全消失

我有一个 WPF 窗口,其中包含ContentPresenter默认情况下高度和宽度设置为 0 的 WPF 窗口。当用户单击一个按钮时,我运行一个动画将 ContentPresenter 的高度和宽度属性转换为 896,1024(实际上它在增长的同时也进行了 3 次旋转),这一切都很好......

用户控件的 DataContext 实现了 IDataErrorInfo,如果用户没有单击“我已阅读并理解这些健康和安全说明”复选框,则复选框周围会显示一个红色边框...

我的问题是,如果用户单击“取消”,并且我运行将高度和宽度缩小回 0,0 的动画,则 UserControl 会根据需要缩小,但红色边框不会完全消失 - 它只留下一个我的窗口中间的红色像素

有人知道我做错了什么吗?我假设“红色边框”只是 WPF 为我呈现的装饰器,所以我不知道如何改变这种行为......

非常感谢所有帮助!

更新- 我尝试了 Abe 的极好建议,但不幸的是它没有用,但它确实让我尝试了其他东西......所以现在我(暂时)注释掉了“缩小”动画,并简单地将可见性设置为 Collapsed at KeyTime="0:0:0.9" ... 当我按下取消键时,不到一秒钟后,UserControl 消失了,但红色的装饰物顽固地保留着:(

作为额外的信息(不确定是否相关?)在 ContentPresenter 中显示的 UserControl 还包含一个 ContentPresenter 来呈现 UserControl,其内部内容包含验证装饰器......

代码示例:

谢谢,伊恩