2013-07-01 3 views
0

그래서 모든 컨트롤과 ValidationErrorTemplate에 대한 거대한 스타일 템플릿 사전이 있습니다. 문제는 컨트롤 위에 위치가없는 경우 컨트롤 아래에 유효성 검사 오류를 표시해야한다는 것입니다. 창 위쪽의 컨트롤을 기본으로합니다. 창의 하단에있는 컨트롤의 경우 컨트롤 위에 유효성 검사가 표시되어야합니다.를 결합하는 것은 가능하다WPF ValidationErrorTemplate 스타일 동적 위치

그 이후

모든 스타일 더 코드 숨김가 정의되어 리소스 사전과도 데이터가 없습니다.

하나의 아이디어는 AdornedElementPlaceholder의 위치를 ​​결정하고 템플릿을 숨기거나 표시하는 것입니다. 그러나 나는 XAML에서 그렇게 할 해결책을 찾지 못했습니다.

<ControlTemplate x:Key="ValidationErrorTemplate"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <Grid Grid.Row="1"> 
       <Border> 
        <AdornedElementPlaceholder /> 
       </Border>     
      </Grid> 
      <AdornerDecorator Grid.Row="????"> 
       <Border > 
        <!-- some style comes here ... --> 
       </Border> 
      </AdornerDecorator> 
     </Grid> 
    </ControlTemplate> 

위해 Grid.Row = "????"은 컨트롤 상단에 따라 0 또는 1이어야합니다.

답변

0

결국 나는 해결책을 찾았습니다 : 첨부 된 속성. 첨부 속성을 만들고 AdornerDecorator.Loaded 이벤트에 가입 한 속성 변경 콜백 메서드에서 만듭니다. 이 방법에서는 필요한 경우 실제 위치를 확인하고 속성을 변경할 수 있습니다.

는 [샘플 코드 조각은, 실제 소스에 더 아웃소싱으로 인한 코드 관련 문제 다시 검사] 당신은 확인 Loaded 이벤트를 사용할 필요가

private static void DecoratorLoaded(object obj, RoutedEventArgs e) 
{ 
    var decorator = obj as Decorator; 
    if (decorator != null && decorator.IsVisible) 
    { 
     // get the position 
     Point renderedLocation = decorator.TranslatePoint(new Point(0, 0), Application.Current.MainWindow); 
     if (renderedLocation != new Point(0, 0)) 
     { 
      // check width 
      var maxAllowedWidth = Application.Current.MainWindow.ActualWidth - renderedLocation.X - 40;    
      decorator.SetValue(FrameworkElement.MaxWidthProperty, maxAllowedWidth); 

      // check place above the control 
      var isEnoughPlaceAbove = renderedLocation.Y > decorator.ActualHeight + 10; 
      decorator.SetValue(Grid.RowProperty, isEnoughPlaceAbove ? 0 : 2); 

      // invalidate to re-render 
      decorator.InvalidateVisual();    
     } 
    } 
} 

renderLocation 당신에게 실제 위치를 제공 할 것 (예 : 0 또는 일부 상대 위치).

<AdornerDecorator Behaviors:AdornerPositionCalculator.AllowDynamicPosition="True"> 
    <!-- custom style here --> 
</AdornerDecorator> 
0

두 개의 별도 템플릿 (반대쪽에 하나씩 있음)이 있으며, 말하고있는 컨트롤이 들어있는 개체가 적합하다고 판단되는 위쪽 항목과 아래쪽 항목 중 하나를 사용하십시오.

+0

큰 소리, 그러나 우리는 키를 사용하여 모든 제어를위한 명시 적 스타일을 정의하지 않으 :

마지막으로 당신은 XAML의 장식에 연결된 속성을 연결해야합니다. Specialy는 프레임 워크를 개발했기 때문에 정확한 스타일 키를 추가하는 것을 잊지 않을 수 없습니다. –

+0

DataTrigger를 사용하여 AdornedElementPlaceholder의 값에 따라 Grid.Row를 설정하는 것에 대해 생각해 보셨습니까? 나는 특별히 전에 이것을 시도한 적이 없지만 그것이 당신이 묘사하는 방식대로 작동 할 것이라고 생각합니다. – Killingsworth