2012-11-15 2 views
2

Adorner를 DateTimePicker control에 추가했지만 다른 컨트롤 상단에는 표시되지 않습니다. 왜? 어떻게 수정해야합니까?다른 모든 것들 위에 WPF Adorners를 그리는 방법은 무엇입니까?

My adorner

내 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

이미 adorner있다 레이어를 기본 창 스타일로 사용하고 그 adorner 레이어를 창의 내용 위에 배치합니다.

그래서 AdornerLayer를 UserControl에서 제거하면 제대로 작동합니다.

+0

'AdornerDecorator'가 없으면 'GetAdornerLayer'가 null을 반환하기 때문에 AdornerDecorator가 있습니다. – Qwertie

+0

아, 생성자 대신 컨트롤의 activate 이벤트에서 adorner 설정을 수행하십시오. GetAdornerLayer가 창 AdornerLayer를 가져 오기 전에 컨트롤이 화면에 있어야합니다. –

+0

어떤 이벤트가 발생 했습니까? UserControl에는 Activate 이벤트가 없습니다. 나는'Loaded'를 시도했지만,'GetAdornerLayer'는 여전히 그 이벤트에서 null을 반환합니다. – Qwertie

1

AdornerDecorator에 의해 관리되는 Adorners가 AdornerDecorator 내의 컨트롤 위에 나타날 것을 보장하기 때문에 문제가 발생한 것 같습니다. 대신 AdornerDecorator에서 대부분의 윈도우 내용을 래핑 할 필요가 있지만 이렇게하면 AdornerLayer.GetAdornerLayer()은 일부 상황에서는 AdornerDecorator를 볼 수 없으며 null을 반환합니다.

"GetAdornerLayer는 지정된 UIElement에서 시작하여 시각적 트리를 위로 이동하고 찾은 첫 번째 adorner 레이어를 반환합니다." 실제로 GetAdornerLayerUserControl 외부에있는 AdornerDecorator을 찾을 수 없으며 적어도 .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 이벤트에서 호출해야합니다.

관련 문제