gpt4 book ai didi

wpf - 在WPF中,如何在DataGrid上显示AdornerLayer

转载 作者:行者123 更新时间:2023-12-04 21:53:13 31 4
gpt4 key购买 nike

我正在使用 codeplex 中的 WPF 数据网格。我正在使用 DatagridTemplateColumn 并且我编写了数据模板来显示每列中的内容。

现在,当数据网格中的任何控件被聚焦时,我必须向用户显示一些帮助消息。
为此,我想到了使用装饰层。我使用了 ComboBox 加载事件并访问了它的 adrorner 层。然后我添加了我自己的装饰层,其中显示了一些类似于工具提示的东西。下面是代码。

        TextBox txtBox = (TextBox)comboBox.Template.FindName("PART_EditableTextBox", comboBox);
if (txtBox == null)
return;

txtBox.ToolTip = comboBox.ToolTip;
AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(txtBox);
Binding bind = new Binding("IsKeyboardFocused");
bind.Converter = new KeyToVisibilityConverter();
bind.Source = txtBox;
bind.Mode = BindingMode.OneWay;
PEAdornerControl adorner = new PEAdornerControl(txtBox);
adorner.SetBinding(PEAdornerControl.VisibilityProperty, bind);

PEAdorner 层是这个::
  public class PEAdornerControl : Adorner
{
Rect rect;

// base class constructor.
public PEAdornerControl(UIElement adornedElement)
: base(adornedElement)
{ }

protected override void OnRender(DrawingContext drawingContext)
{
.....
}
}

现在的问题如下。我附上了它在数据网格中的外观截图。如果数据网格有超过 4 行,一切都很好。下面是屏幕截图

Correct help text

如果 datagrid 的行数较少,则此装饰器进入 datagrid 内部并且对用户不可见。截图如下
Half help text

如何在 DataGrid 上方获得这个装饰层? 请帮我 !!!

最佳答案

我再次看了你的问题,我认为这就是你所需要的。

    TextBox txtBox = (TextBox)comboBox.Template.FindName("PART_EditableTextBox", comboBox);
if (txtBox == null)
return;

txtBox.ToolTip = comboBox.ToolTip;

//this is locating the DataGrid that contains the textbox
DataGrid parent = FindParent<DataGrid>(this);

//Get the adorner for the parent
AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(parent);
Binding bind = new Binding("IsKeyboardFocused");
bind.Converter = new KeyToVisibilityConverter();
bind.Source = txtBox;
bind.Mode = BindingMode.OneWay;
PEAdornerControl adorner = new PEAdornerControl(txtBox);
adorner.SetBinding(PEAdornerControl.VisibilityProperty, bind);

查找父方法是这样的:
public T FindParent<T>(DependencyObject obj) where T : DepedencyObject
{
if (obj == null)
return null;
DependencyOBject parent = VisualTreeHelper.GetParent(obj);

if (parent is T)
return parent as T;
else
return FindParent<T>(parent);
}

您可能需要在 OnRender 方法中设置装饰器的位置,但这应该可以工作。但需要考虑的一件事是,如果您的 DataGrid 位于另一个容器(例如面板、网格等)中,那么您可能仍会遇到裁剪问题。

剪裁问题是因为当容器检查其子项的布局时,它通常不会考虑其装饰器。为了解决这个问题,您可能需要创建自己的控件并覆盖 MeasuerOverride(Size constraint) 方法。

例子:
public class MyPanel : Panel
{
protected override Size MeasureOverride(Size constraint)
{
Size toReturn = new Size();
foreach (UIElement child in this.InternalChildren)
{
//Do normal Measuring of children

foreach( UIElement achild in AdornerLayer.GetAdorners(child))
//Measure child adorners and add to return size as needed
}

return toReturn;
}
}

该代码对于衡量来说非常粗糙,但应该为您指明正确的方向。查看文档页面 http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride.aspx有关测量面板中子元素的信息。

关于wpf - 在WPF中,如何在DataGrid上显示AdornerLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5595243/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com