标签: adorner

我什么时候应该使用装饰品?

WPF非常棒,因为有很多方法可以实现您的目标.例如,根据我的理解,装饰者可以向UI元素添加一些控件,但我认为通过包含附加元素的自定义控件可以实现相同的行为.

所以,我的问题是:我应该何时更喜欢装饰者更复杂(但我认为,更灵活)的自定义控制?请考虑我正在广泛使用MVVM模式,我想将命令绑定到附加元素.

特别是,我正在设计一个图表设计器应用程序,我想为我的形状添加连接点.我应该在自定义控件和装饰器之间做出决定的另一个示例是显示自动定位以"跟随"该线的标签的线.

谢谢

wpf adorner

47
推荐指数
1
解决办法
2万
查看次数

WPF:忽略鼠标单击overlay/adorner,但处理MouseEnter事件

我真正想要的是一个IsHitTestVisible版本,它忽略鼠标点击事件但仍然捕获鼠标进入和离开事件.

背景:无论何时,都会在控件下弹出信息覆盖.这是一个要求,所以我不能自由地删除这种行为.这是使用包含矩形形状的装饰器实现的,该装饰器填充有图像画笔.所有控件都以编程方式创建,不涉及XAML.

期望的行为:当用户将鼠标悬停在Rectangle上时,它应该变为部分透明.这样他们就可以看到叠加层下方的其他控件并单击它们.当用户点击叠加层时,点击应该传递到叠加层下面的任何控件,即用户点击的位置.

问题:如果我将IsHitTestVisible设置为True以允许鼠标点击通过,我不会获得MouseEnter事件.

是否有一种简单的方法可以让IsHitTestVisible保持True,然后将2-3个事件传递给adorner下面的正确控件?我正在寻找一个不涉及计算光标下方控件的解决方案,因为WPF显然能够为我做这个.

或者,我可以将IsHitTestVisible设置为False,然后使用另一种简单方法来确定鼠标何时在装饰器上方?

更新:我仍然希望得到答案,但截至目前,最有希望的解决方案似乎是保持IsHitTestVisible为真,并使用WPF命中测试API来确定鼠标光标下面的控件类型; 如果它是我所知道的,我会向它发送一个Click命令.不过,不确定这是否值得做; 截至目前,点击解除我的叠加层,因此用户只需点击两次.

谢谢!

wpf adorner mouseevent transparent-control

21
推荐指数
1
解决办法
7256
查看次数

WPF Adorner Layer Outside Window

我有一个带文本框控件的WPF窗口.该控件具有一个装饰器,当文本框具有键盘焦点时,该装饰器可见.

正如您在下面的屏幕截图中看到的那样,装饰器仅限于窗口的边界.如何才能显示完整的装饰?

在此输入图像描述

Adorner模板是:

<DataTemplate x:Key="ContextualInfoDataTemplate">
    <Border 
        Background="#E1E1E1" 
        CornerRadius="6"
        Margin="50,36,0,0">
        <Border.Effect>
            <DropShadowEffect/>
        </Border.Effect>
        <Grid Width="200" Margin="4,3,4,4">
            <TextBlock TextWrapping="Wrap" Text="OverridenAutomationId"/>
        </Grid>
    </Border>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

wpf adorner

18
推荐指数
1
解决办法
1355
查看次数

为什么我的装饰者在应用它的元素发生变化时不会重新渲染?

在我正在构建的用户界面中,只要面板中的一个控件具有焦点,我就想要装饰面板.因此,我处理IsKeyboardFocusWithinChanged事件,并在元素获得焦点时添加元素,并在焦点失去焦点时移除元素.这似乎工作正常.

我遇到的问题是,如果装饰元素的边界发生变化,则不会重新渲染装饰器.例如,在这个简单的情况下:

<WrapPanel Orientation="Horizontal"
           IsKeyboardFocusChanged="Panel_IsKeyboardFocusChanged">
   <Label>Caption</Label>
   <TextBox>Data</TextBox>
</WrapPanel>
Run Code Online (Sandbox Code Playgroud)

装饰器正确地装饰了接收焦点WrapPanel时的边界TextBox,但是当我输入文本时,TextBox会在装饰边缘下面展开.当然,只要我做任何迫使装饰者渲染的东西,例如ALT-TAB从应用程序中移出或给予另一个小组焦点,它就会自行纠正.但是,如果装饰元素的边界发生变化,我怎样才能重新渲染它?

wpf adorner

16
推荐指数
1
解决办法
2万
查看次数

如何在WPF中的控件上显示进度条

在WPF UserControl中,我必须调用WebService.我在一个单独的线程上进行此调用,但我想通知用户该调用可能需要一些时间.

WebMethod返回一个对象集合,并将其绑定到我的UC中的ListBox.到目前为止,这么好......这部分效果非常好.但是,我想在通话期间显示进度条(或任何类型的动画......).此动画将位于顶部并以ListBox控件为中心.

我试过Adorner,它部分有用.但是,我必须在受保护的覆盖void OnRender(DrawingContext drawingContext)中绘制所有控件...我只想添加一个控件几秒钟......

任何人都知道如何实现这一目标?

谢谢!

.net wpf adorner .net-3.5 progress-bar

10
推荐指数
1
解决办法
7757
查看次数

什么时候WPF装饰层首次可用?

我正在尝试为我的UserControl添加叠加效果,我知道这是在WPF中使用的装饰器.但我对他们认为如何工作有点困惑.我认为adorner层是由WPF运行时隐式处理的,因此应始终可用.

但是当我在代码中创建UserControl的实例时,那里没有adorner层.以下代码失败,但有异常:

var view = new MyUserControl();
var target = view.GetAdornerTarget(); // This returns a specific UI control.
var layer = AdornerLayer.GetAdornerLayer(target);
if (layer == null)
{
    throw new Exception("No adorner layer at the moment.");
}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释,这应该如何运作?我是否需要先将UserControl实例放入顶级窗口?或者我是否需要以某种方式自己定义图层?挖掘文档让我无处可去.

谢谢!

wpf user-controls adorner

10
推荐指数
1
解决办法
5398
查看次数

GetAdornerLayer神秘地返回null

我一直在为我的应用程序的几个版本使用相同的代码而没有任何问题,但我现在神秘地接受NullRerefenceException以下内容:

this.Loaded += delegate {
    deleteBrush = new DeleteBrushAdorner( background );
    AdornerLayer al = AdornerLayer.GetAdornerLayer( background );
    al.Add( deleteBrush ); // null ref here??
};
Run Code Online (Sandbox Code Playgroud)

background只是一个Border元素.

我对可能导致它的原因的两点看法是:a)切换到.NET 4.0,以及b)将上述元素(即a)的实例UserControl放在一个ItemsControl.

奇怪的是,这并不是一直发生的,而且很难预测何时会发生,所以它不可靠.

c# wpf adorner adornerlayer nullreferenceexception

10
推荐指数
2
解决办法
8646
查看次数

WPF Adorner剪辑

我有ItemsControl一个ScrollViewer.其中的项目ItemsControl扩展为DataTemplate基本上由a 组成的项目Adorner.

现在的问题是,当滚动时,视觉儿童在Adorner外面可见ScrollViewer.让我们说我从水平偏移0滚动到100,Adorner向左移动的视觉子项并且在旁边可见ScrollViewer,尽管它们应该被隐藏.设置ClipToBoundsItemsControlScrollViewer不起作用.

我理解,这Adorner是在z顺序上呈现在所有元素之上,但它们确实不应该在诸如此类的情况下可见ScrollViewer.Element通过这种方式装饰的行为与预期的一样,并且不可见ScrollViewer.

是否有任何简单的方法来"剪辑" Adorners,以便它们仅在可见滚动区域中可见?

谢谢,Andrej

wpf clipping adorner

8
推荐指数
2
解决办法
4699
查看次数

可以清除装饰层吗?

我可能误解了WPF中的adorner层的概念,但我设法添加了TextBlock一个StackPaneladorner层.

如何清除装饰图层?那么例如,StackPanel不再有TextBlock它的装饰层吗?

c# wpf adorner

8
推荐指数
1
解决办法
3946
查看次数

WPF拖放源代码

关于在WPF中拖放的stackoverflow的几乎所有问题都可以参考这篇文章.但是,缺少该文章的源代码.有没有人有副本或知道在哪里找到副本?

PS我的主要关注点是文章中的这一行:"有更多的代码DragAdorner,但主要是用于定位装饰,因为拖动正在发生......请参考示例......"我不知道他是如何定位的拖动装饰.

c# wpf drag-and-drop adorner

8
推荐指数
1
解决办法
4372
查看次数