2016-09-27 34 views
0

我正在WPF應用程序上工作,並且已將自定義錯誤模板添加到所有文本框。我的應用程序以全屏模式運行。該錯誤顯示在停靠在控件右側的DockPanel(AdornedElementPlaceholder)中。但是,如果控件已經位於屏幕的右側,則會導致錯誤顯示在應用程序的邊界之外。自定義ErrorTemplate關閉屏幕顯示錯誤

我正在尋找一種方法來檢查ErrorBorder的最右上角/底角是否超出了應用程序的範圍。如果是這樣,請將對接從右側改爲左側。我正在考慮在ErrorBorder控件上使用各種類型的轉換器。這是我的ErrorTemplate的代碼。

錯誤模板:

<ControlTemplate x:Key="CustomErrorTemplate"> 
    <DockPanel> 
     <!--ERROR--> 
     <Border x:Name="ErrorBorder" 
       Background="Red" 
       BorderBrush="Black" 
       BorderThickness="1" 
       DockPanel.Dock="Right" 
       Margin="5 0" 
       Height="{Binding ActualHeight, 
           ElementName=ErrorAdorner}"> 
      <TextBlock Background="Red" 
         Foreground="White" 
         VerticalAlignment="Center" 
         FontSize="{Binding ActualHeight, 
              Converter={StaticResource FontSizeConverter}, 
              RelativeSource={RelativeSource AncestorType={x:Type Border}, 
                     Mode=FindAncestor}}" 
         Text="{Binding ElementName=ErrorAdorner, 
             Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"/> 
     </Border> 
     <!--CONTENT--> 
     <AdornedElementPlaceholder x:Name="ErrorAdorner" /> 
    </DockPanel> 
    <ControlTemplate.Triggers> 
     <DataTrigger Value="True"> 
      <DataTrigger.Binding> 
       <MultiBinding Converter="{StaticResource BooleanToOrConverter}"> 
        <Binding ElementName="ErrorAdorner" Path="AdornedElement.IsKeyboardFocused" /> 
        <Binding ElementName="ErrorAdorner" Path="AdornedElement.IsMouseOver" /> 
       </MultiBinding> 
      </DataTrigger.Binding> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard x:Name="FadeInStoryboard"> 
        <Storyboard> 
         <DoubleAnimation Duration="00:00:00.15" 
             Storyboard.TargetName="ErrorBorder" 
             Storyboard.TargetProperty="Opacity" 
             To="1" /> 
         <ThicknessAnimation Duration="00:00:00.15" 
              Storyboard.TargetName="ErrorBorder" 
              Storyboard.TargetProperty="Margin" 
              FillBehavior="HoldEnd" 
              From="1,0,0,0" 
              To="5,0,0,0"> 
          <ThicknessAnimation.EasingFunction> 
           <BackEase EasingMode="EaseOut" Amplitude="2"/> 
          </ThicknessAnimation.EasingFunction> 
         </ThicknessAnimation> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
       <StopStoryboard BeginStoryboardName="FadeInStoryboard"/> 
       <BeginStoryboard x:Name="FadeOutStoryBoard"> 
        <Storyboard> 
         <DoubleAnimation Duration="00:00:00" 
             Storyboard.TargetName="ErrorBorder" 
             Storyboard.TargetProperty="Opacity" 
             To="0"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

注:我用我的應用程序中的各種控制同樣的錯誤模板。所以我的目標需要與「任何」控制一起工作。

另外,這裏是我如何爲所有TextBox控件實現我的錯誤模板。

文本框風格:

<Style TargetType="{x:Type TextBox}"> 
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource CustomErrorTemplate}" /> 
<Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="BorderBrush" Value="Red" /> 
     <Setter Property="BorderThickness" Value="2" /> 
     <Setter Property="Background"> 
      <Setter.Value> 
       <SolidColorBrush Color="Pink" /> 
      </Setter.Value> 
     </Setter> 
    </Trigger> 
</Style.Triggers> 

任何指導,將是非常讚賞。

回答

1

簡單的方法

對於這種特殊的情況下

再創建一個ErrorTemplate與DockPanel.Dock = Left在其ErrorBorder設置。在DockPanel中設置一些MinWidth=200

在您的TextBox中處理Validation.Error="Tb_Error_1",並在您的Binding中設置NotifyOnValidationError="True"

private void Tb_Error_1(object sender, ValidationErrorEventArgs e) 
    { 
     ControlTemplate template = this.Resources["LeftCustomErrorTemplate"] as ControlTemplate; 
     double minWidth = 200; // This we set in DockPanel in ControlTemplate 

     Vector tbofset = VisualTreeHelper.GetOffset(sender as TextBox); 

     if (tbofset.Length + minWidth > this.ActualWidth - tbofset.X) 
      Validation.SetErrorTemplate(Tb, this.Resources["LeftCustomErrorTemplate"] as ControlTemplate); 
     else 
      Validation.SetErrorTemplate(Tb, this.Resources["CustomErrorTemplate"] as ControlTemplate); 
    } 

最好的辦法是使用一個ToolTip

使用ToolTip。這是因爲CustomPopupPlacementCallback,它允許您指定各種放置位置數組,並且框架決定哪一個提供對ToolTip的最佳可見性。

A ToolTip重新調整自己始終顯示完全可見。

How to: Specify a Custom Popup Position ?

+0

這工作完美。如果屏幕關閉,工具提示將重新調整。謝謝! – Chris