Wpf 在一切之上呈现usercontrol
我有一个usercontrol,我想通过rendertransform设置它的动画。(旋转、平移、缩放) 它工作得很好,但是控件位于具有其他控件的层下面的层上,这些控件是由具有itemsources的itemcontrols创建的。 usercontrol不应该知道它的父对象,所以我想我正在寻找类似于通用渲染zindex的东西 我的想法是使用一个弹出窗口,但它有性能缺点和鼠标事件的复杂性。 (这是用bitmapcachebrush实现的) 我想我无法从itemscontrol的itemssource中取出项目并将其放在前一层 我要找的是装饰品吗?而且它不必/不应该对鼠标事件做出响应。(处理鼠标进入和离开的画布父对象是)Wpf 在一切之上呈现usercontrol,wpf,animation,user-controls,render,z-index,Wpf,Animation,User Controls,Render,Z Index,我有一个usercontrol,我想通过rendertransform设置它的动画。(旋转、平移、缩放) 它工作得很好,但是控件位于具有其他控件的层下面的层上,这些控件是由具有itemsources的itemcontrols创建的。 usercontrol不应该知道它的父对象,所以我想我正在寻找类似于通用渲染zindex的东西 我的想法是使用一个弹出窗口,但它有性能缺点和鼠标事件的复杂性。 (这是用bitmapcachebrush实现的) 我想我无法从itemscontrol的itemssour
还有其他可能性吗?1.自定义控件xaml剪切 2.自定义控件鼠标事件 3.ui元素装饰器类
<Grid x:Name="adholder" Width="{Binding ElementName=thiscontrol, Path=ActualWidth}">
<!-- Add adorning content here -->
<Grid x:Name="gridAnimation" IsHitTestVisible="False"
Height="{Binding ElementName=thiscontrol, Path=ActualHeight}"
Width="{Binding ElementName=thiscontrol, Path=ActualWidth}">
<Grid.CacheMode>
<BitmapCache x:Name="bmpcache" EnableClearType="True"
RenderAtScale="1"
SnapsToDevicePixels="False"
/>
</Grid.CacheMode>
private void thiscontrol_MouseEnter(object sender, MouseEventArgs e)
{
if (StoryboardEnter != null)
{
layer = AdornerLayer.GetAdornerLayer(gridAnimation);
adholder.Children.Clear();
adc = new AdornerContentPresenter(adholder);
adc.Content = gridAnimation;
layer.Add(adc);
StoryboardEnter.RunAnim(gridAnimation, AnimationDirection.To, AnimationReset.Reset);
}
}
//not my code
public class AdornerContentPresenter : Adorner
{
private VisualCollection _Visuals;
private ContentPresenter _ContentPresenter;
public AdornerContentPresenter(UIElement adornedElement)
: base(adornedElement)
{
_Visuals = new VisualCollection(this);
_ContentPresenter = new ContentPresenter();
_Visuals.Add(_ContentPresenter);
}
public AdornerContentPresenter(UIElement adornedElement, Visual content)
: this(adornedElement)
{ Content = content; }
protected override Size MeasureOverride(Size constraint)
{
_ContentPresenter.Measure(constraint);
return _ContentPresenter.DesiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
_ContentPresenter.Arrange(new Rect(0, 0,
finalSize.Width, finalSize.Height));
return _ContentPresenter.RenderSize;
}
protected override Visual GetVisualChild(int index)
{ return _Visuals[index]; }
protected override int VisualChildrenCount
{ get { return _Visuals.Count; } }
public object Content
{
get { return _ContentPresenter.Content; }
set { _ContentPresenter.Content = value; }
}
}
私有void thiscontrol\u MouseEnter(对象发送方,MouseEventArgs e)
{
if(故事板输入!=null)
{
layer=AdornerLayer.GetAdornerLayer(网格动画);
adholder.Children.Clear();
adc=新的AdornerContentPresenter(adholder);
adc.Content=gridAnimation;
层。添加(adc);
StoryboardEnter.RunAnim(gridAnimation,AnimationDirection.To,AnimationReset.Reset);
}
}
//不是我的代码
公共类AdornerContentPresenter:Adorner
{
私人视觉收藏(VisualCollection);;
私有ContentPresenter\u ContentPresenter;
公共AdornerContentPresenter(UIElement-adornedElement)
:基础(装饰元素)
{
_视觉=新的视觉集合(本);
_ContentPresenter=新的ContentPresenter();
_添加(_ContentPresenter);
}
公共AdornerContentPresenter(UIElement-adornedElement,可视内容)
:此(装饰元素)
{Content=Content;}
受保护的覆盖尺寸测量覆盖(尺寸约束)
{
_ContentPresenter.Measure(约束);
return\u ContentPresenter.DesiredSize;
}
受保护的替代尺寸排列替代(尺寸最终化)
{
_ContentPresenter.Arrange(新矩形(0,0,0,
最终尺寸(宽度、最终尺寸(高度));
返回_ContentPresenter.RenderSize;
}
受保护的重写Visual GetVisualChild(int索引)
{return _Visuals[index];}
受保护的重写int VisualChildrenCount
{get{return\u Visuals.Count;}}
公共对象内容
{
获取{return\u ContentPresenter.Content;}
设置{u ContentPresenter.Content=value;}
}
}