这有点像WPF whodunnit!我的验证寺庙在预期时没有出现
问题
基本上,我在我的视图模型上使用IDataErrorInfo来提供有关数据输入错误的反馈.我可以看到这被调用并按预期工作,但WPF从不显示绑定控件的验证错误模板!
我已尝试使用内置的默认文本框红色边框错误模板,样式错误模板和硬编码模板.这些都不会在数据错误情况下显示.
继承我的xaml绑定代码:
<TextBox x:Name="txtCaseNumber"
Text="{Binding Path=CaseNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/>
Run Code Online (Sandbox Code Playgroud)
很奇怪,错误进入Validation.Errors集合.以下代码导致我的IDataErrorInfo错误消息显示在绑定控件旁边.这让我认为问题出在xaml方面,而不是viewmodel方面.
<ContentPresenter
Content="{Binding ElementName=txtCaseNumber, Path=(Validation.Errors).CurrentItem}" />
Run Code Online (Sandbox Code Playgroud)
另外,
System.Windows.Controls.Validation.GetHasError(txtCaseNumber)返回true.
如果有所作为,我将在winforms中托管WPF.我在代码或样式中找不到任何对Validation或ErrorTemplate的引用,所以我很确定这不是一个样式自己的目标.
我创建了一个逻辑,用于裁剪包含在网格内部边框内的图像.网格有很多边框,所以这个网格会有很多图片.问题是,当我缩放图片时,逻辑会缩放图片(这没关系)但是当我使用裁剪逻辑时,它AdornerLayer会像图片一样走出边框:
在这张图片上,pic没有缩放,所以这AdornerLayer是正确的:
我用来将裁剪添加到图像的代码:
private void AddCropToElement(FrameworkElement fel, System.Drawing.Image img)
{
if (!cropElements.ContainsKey(Convert.ToString(((Image)fel).Source)))
{
if (_felCur != null)
{
RemoveCropFromCur();
}
rcInterior = new Rect(
fel.ActualWidth * 0.2,
fel.ActualHeight * 0.2,
fel.ActualWidth * 0.6,
fel.ActualHeight * 0.6);
rectMoving = false;
Rect newRect = scaleRect(rcInterior, img);
imgCropMove = img;
AdornerLayer aly = AdornerLayer.GetAdornerLayer(fel);
_clp = new CroppingAdorner(fel, rcInterior);
aly.Add(_clp);
cropElements.Add(Convert.ToString(((Image)fel).Source), fel);
imageCropped = _clp.Crop(new System.Drawing.Bitmap(img), newRect);
_clp.CropChanged += HandleCropChanged;
_felCur = fel;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,名为fel的对象是我要裁剪的图片,而Border是他的父级.
如果图像被缩放,我如何解决AdornerLayout外出的问题?
我一直在为我的应用程序的几个版本使用相同的代码而没有任何问题,但我现在神秘地接受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.
奇怪的是,这并不是一直发生的,而且很难预测何时会发生,所以它不可靠.
我有一个图像编辑应用程序,我有自定义的装饰器,添加到AdornerLayer.当用户点击Adorner时,我想将其置于顶部 - 这意味着如果它被拖到另一个装饰器上,我希望第一个点击被最顶层的装饰者捕获.
我无法弄清楚如何更改AdornerLayer的子元素的z顺序.它似乎不允许我对它们进行排序.即使我删除并重新添加了Adorner,它也不是最重要的.
我正在开发WPF中的桌面应用程序,它包含不同类型的形状(如圆形,半径圆形,直径圆形).现在我需要按需调整形状大小,所以我使用.Net adorner它可以灵活地拖动和调整形状.确切的问题是我想同时调整两个元素的大小(即*当我调整圆的大小时,半径线也应该相对于半径的起点和终点调整大小).
注意我没有尝试任何东西(我还没有做任何开发,所以我没有代码).
更新了您的代码的试用版.这是一个Diameter Circle所以当我拖动它时它只会拖动椭圆
public class SimpleCircleAdorner : Adorner
{
// Be sure to call the base class constructor.
public SimpleCircleAdorner(UIElement adornedElement, Panel ownerPanel)
: base(adornedElement)
{
_ownerPanel = ownerPanel;
}
protected override void OnMouseEnter(MouseEventArgs e)
{
Point point = Mouse.GetPosition(AdornedElement);
_currentPosition = getMousePosition(point);
switch (_currentPosition)
{
case MousePosition.BR:
case MousePosition.TL:
Cursor = Cursors.SizeNWSE;
break;
case MousePosition.BL:
case MousePosition.TR:
Cursor = Cursors.SizeNESW;
break;
}
}
protected override void OnMouseLeave(MouseEventArgs e)
{
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(AdornedElement); …Run Code Online (Sandbox Code Playgroud) 我有一个与鼠标光标一起移动的装饰器.然而,只要鼠标移出窗外,装饰者就会被切断.
是否可以将装饰图层扩展到整个屏幕或创建新的装饰图层.
我正在努力确保我的错误装饰器不会被我的滚动查看器限制.我有一系列文本框位于固定宽度滚动查看器的边缘(没有水平滚动,只有垂直).然后,我有标记文本框错误的装饰者.
问题是装饰者被剪裁在滚动查看器的边缘.
有任何想法吗?
*注意:我已尝试将所有内容包装在AdornerDecorator中.
我正在尝试在wpf中创建一个叠加层(背景变暗),类似于在网络上可以找到弹出图像的叠加层.我希望它可以在应用程序的多个部分中重用,具有不同类型的内容.
这是adorner类的构造函数的临时代码(只是为了尝试)
private readonly Grid _grid = new Grid();
public DarkOverlayAdorner(UIElement adornedElement, Object content) :
base(adornedElement)
{
_grid.Background = new SolidColorBrush(Color.FromArgb(99, 0, 0, 0));
IsHitTestVisible = true;
var visual = content as UIElement;
if (visual != null)
_grid.Children.Add(visual);
}
Run Code Online (Sandbox Code Playgroud)
另外在课堂上(当然),我有MeasureOverride和ArrangeOverride的ovverrides给予装饰者正确的装饰元素大小,GetVisualChild和VisualChildCount ......
这里的问题是正确显示了装饰器,但是在装饰元素上没有应用任何事件或行为.例如:
AdornerLayer layer = AdornerLayer.GetAdornerLayer(textBoxProva);
layer.Add(new DarkOverlayAdorner(textBoxProva, new Button{Content = "prova"}));
Run Code Online (Sandbox Code Playgroud)
此处显示按钮,但我无法单击该按钮,并且不会对按钮鼠标悬停应用任何效果.我仍然无法弄清楚问题.
我正在使用包含画布的用户控件。作为画布的子级,有带有装饰器的内容控制。为什么装饰器不可见,也许装饰器层已被覆盖。一切都是被创造和附着的。装饰层在视觉树中位于非常高的位置。装饰层放置在 UserControl 之外。
我知道这是因为我实现了基本的运动机制而创建的,但装饰器从未出现。
必须做什么才能向装饰者展示?
我有一个用户验证的WPF应用程序.根据文档,这将在adorner图层中呈现,该图层显示在所有其他图层上方.
在屏幕截图中,您可以看到这不是我想要的.我有一个名为'Alert details'的弹出窗口,它ChildWindow来自Extended WPF Toolkit.它位于装饰层后面.如何让弹出窗口出现在装饰图层的前面?
我已经尝试Panel.ZIndex在ChildWindow上设置一个非常高的但是这没有什么区别.
