2012-06-28 87 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的高度=「自動」,但它沒有幫助。每個控件位於一個網格單元格中,並且網格的行高也是自動的。 你能告訴我我錯過了什麼嗎?我想要錯誤消息推動下面的內容。 謝謝。

回答

3

Validation.ErrorTemplate顯示裝飾層上的錯誤反饋。這意味着當佈局系統測量和排列裝飾元素圖層上的控件時,將不會考慮此模板中的所有控件。

+0

謝謝您的回答。這是否意味着沒有什麼可以做,使其表現得如我所願? –

+2

我認爲你必須將你的標籤移動到裝飾元素層(在你的控制下),並用[Validation.HasError Attached Property](http://msdn.microsoft.com/en-us/library/system)觸發它的可見性。 windows.controls.validation.haserror.aspx)和一個BooleanToVisibilityConverter。 – LPL

+0

非常感謝。 –

0

我發現這一點,並感謝LPL,我不知道有關裝飾層。

我的解決方案是一個邊緣「黑客」。我只是使用觸發器:

<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> 

要增加裝飾文本框的底部邊距。我將足夠大的邊距設置爲足以爲單個字符串文本塊/標籤騰出空間,然後將以下內容向下移動