2012-06-28 5 views
2

У меня есть следующий стиль для проверки ввода в моем управлении:WPF ControlTemplate Высота

<Style x:Key="MyErrorTemplate" TargetType="Control"> 
    <Style.Setters> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate x:Name="ControlErrorTemplate"> 
        <StackPanel Orientation="Vertical" Height="Auto"> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Foreground="Red" FontSize="20">!</TextBlock> 
          <AdornedElementPlaceholder x:Name="Holder"/> 
         </StackPanel> 
         <Label Foreground="Red" Content="{Binding ElementName=Holder, 
          Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
</Style> 

Если ошибка происходит, то сообщение об ошибке в метке под контролем (например, текстовое поле) появляется и перекрывает ниже контроль. Я сделал StackPanel Height = "Auto", но это не помогло. Каждый элемент управления находится в ячейке Grid, а высота строки Grid также Auto. Не могли бы вы рассказать мне, что мне не хватает? Я хочу, чтобы сообщение об ошибке нажало то, что ниже. Спасибо.

ответ

3

Validation.ErrorTemplate показывает обратную связь с ошибкой на слое adorner. Это означает, что все элементы управления в этом шаблоне не будут учитываться, когда система макета измеряет и организует элементы управления на слое украшенного элемента.

+0

Благодарим вас за ответ. Означает ли это, что ничего нельзя сделать, чтобы вести себя так, как мне хотелось бы? –

+2

Думаю, вам нужно перенести свой ярлык на слой с украшенным элементом (под вашим контролем) и вызвать его видимость с помощью [Validation.HasError Attached Property] (http://msdn.microsoft.com/en-us/library/system. windows.controls.validation.haserror.aspx) и BooleanToVisibilityConverter. – LPL

+0

Большое спасибо. –

0

Я нашел это и поблагодарил LPL, я не знал об этом слое adorner.

Моим решением было «взломать» маржу. Я просто использовал спусковой крючок:

<Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/> 
      <Setter Property="BorderBrush" Value="Red"/> 
      <Setter Property="Margin" Value="0,0,0,28"/> 
     </Trigger> 
    </Style.Triggers> 

Увеличить нижний край украшенного текстового поля. Я установил край достаточно большой, чтобы освободить место для одного текстового блока/метки строки, а затем содержимое было перемещено вниз