我已经为我的DateTimePicker control添加了一个装饰工具,但它没有显示在其他控件之上。为什么?我该如何解决?
我的XAML目前是这样的:
<UserControl x:Class="IntelliMap.WPF.DateTimePicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:wpftc="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
mc:Ignorable="d">
...
<AdornerDecorator>
<Grid>
...
<TextBox x:Name="DateDisplay"
HorizontalAlignment="Stretch" ...>
</TextBox>
...
</Grid>
</AdornerDecorator>
</UserControl>
adorner本身是一个与UserControl不同的类,并添加到构造函数中:
public DateTimePicker()
{
InitializeComponent();
...
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(DateDisplay);
if (adornerLayer != null)
{
adornerLayer.Add(_upDownBtns = new TextBoxUpDownAdorner(DateDisplay));
_upDownBtns.Click += (textBox, direction) => { OnUpDown(direction); };
}
}
答案 0 :(得分:1)
问题显然是因为AdornerDecorator
管辖的装配工只能保证显示在AdornerDecorator内的控件之上。有必要在AdornerDecorator中包含窗口的大部分内容,但在执行此操作后,AdornerLayer.GetAdornerLayer()
在某些情况下显然无法看到AdornerDecorator并返回null。
文档声明“GetAdornerLayer从指定的UIElement
开始走向可视树,并返回它找到的第一个装饰层。”实际上,GetAdornerLayer
无法在AdornerDecorator
之外找到UserControl
,至少在.NET 3.5中找不到。我通过完全按照GetAdornerLayer
声称要做的事情来解决问题:
static AdornerLayer GetAdornerLayer(FrameworkElement subject)
{
AdornerLayer layer = null;
do {
if ((layer = AdornerLayer.GetAdornerLayer(subject)) != null)
break;
} while ((subject = subject.Parent as FrameworkElement) != null);
return layer;
}
public DateTimePicker()
{
InitializeComponent();
...
this.Loaded += (s, e) =>
{
// not null anymore!
AdornerLayer adLayer = GetAdornerLayer(DateDisplay);
};
}
最后,必须从GetAdornerLayer
事件而不是构造函数调用Loaded
。
答案 1 :(得分:0)
默认的窗口样式中已经有一个装饰图层,该装饰图层位于窗口内容的上方。
所以只需从UserControl中删除AdornerLayer即可。