【问题标题】:WPF Validation error text overflowWPF 验证错误文本溢出
【发布时间】:2017-11-19 17:55:31
【问题描述】:

你好,我对 xaml 很陌生,我真的不知道这样的 bug 叫什么。 我有以下 <ControlTemplate><Style> 在我在后面的代码上创建的 TextBoxes 旁边显示验证错误。我遇到的问题是验证错误中的文本溢出网格,并且 ScrollViewer 不会像网格中的其他子项那样扩展它。

<UserControl.Resources>
    <local:ValidationModels x:Key="validationModels" textBox_Text=" " />
    <ControlTemplate x:Key="validationTemplate" >
        <DockPanel Grid.Column="2">
            <TextBlock Foreground="Red" FontSize="15" Text="Error"  DockPanel.Dock="Right"></TextBlock>
            <AdornedElementPlaceholder/>
        </DockPanel>
    </ControlTemplate>

    <Style x:Key="InputControlErrors" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"    
          Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

然后我的 xaml 部分包含 &lt;ScrollViewer&gt; &lt;Grid&gt;

      <StackPanel Orientation="Vertical">
        <Label Content="NCR Assignment" FontSize="32" FontWeight="Bold" HorizontalAlignment="Center" Margin="16"/>
        <ScrollViewer Height="314" Margin="48,0,52,0" HorizontalScrollBarVisibility="Auto"  VerticalScrollBarVisibility="Visible" >
            <Grid Name="NCRGrid" RenderTransformOrigin="0.365,0.559">
                <Grid.ColumnDefinitions >
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
            </Grid>
        </ScrollViewer>
        </StackPanel>

我将 TextBlock 控件添加到 Grid 的第一列,并将 TextBox 控件添加到 Grid 的第二列。

我面临的问题是 ScrollViewer 扩展了 TextBlock 文本和 TextBox 字段(我可以水平滚动),但它不会扩展来自 ControlTemplate 的验证错误文本,我看到它的唯一方法是最大化手动打开窗口。

<ControlTemplate x:Key="validationTemplate" >
    <DockPanel Grid.Column="2">
        <TextBlock Foreground="Red" FontSize="15" Text="Error"  DockPanel.Dock="Right"></TextBlock>
        <AdornedElementPlaceholder/>
    </DockPanel>
</ControlTemplate>

我在 后面的代码中将 TextBlock 和 TextBox 对象都添加到了 Grid 中

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    这是设计使然。 Validation.ErrorTemplate 将显示在装饰层上。装饰层中的元素呈现在其余可视元素之上,并且在布局系统测量和排列控件时不会考​​虑它们。

    来自 MSDN:https://msdn.microsoft.com/en-us/library/system.windows.documents.adornerlayer(v=vs.110).aspx

    任何放置在装饰层中的东西都会呈现在您设置的任何样式的其余部分之上。换句话说,装饰器在视觉上总是在顶部,不能使用 z-order 覆盖。

    【讨论】:

    • 太难过了!!有没有办法让我在文本框字段内显示错误,例如显示红色“!” .或者例如在发生验证错误时使文本框边框变为红色?
    • 您可以在 ErrorTemplate 中的 AdornedElementPlaceholder 周围放置一个边框。更多信息请参考以下博文:blog.magnusmontin.net/2013/08/26/data-validation-in-wpf.
    【解决方案2】:

    因为不可能按照我希望的方式来做,就像他回答中提到的 mm8 一样。我试图解决它,它对我有用,我在网格中添加了一个新列并使其变小(只是为了在其中显示错误)

       <Grid.ColumnDefinitions >
                        <ColumnDefinition Width="322*" />
                        <ColumnDefinition Width="165*" />
                        <ColumnDefinition Width="37*" />
       </Grid.ColumnDefinitions>
    

    并为其添加了一个空元素。

     TextBlock columnSpace = new TextBlock();
     columnSpace.Text = "      "; //empty spaces
     Grid.SetColumn(columnSpace, 2);
     NCRGrid.Children.Add(columnSpace);
    

    ScrollViewer 扩展为第三列,这将使您能够看到验证错误文本。

    不是最聪明的方法,但它有效!

    【讨论】:

      【解决方案3】:

      这对我有用

       <Grid>
          <Grid.ColumnDefinitions>
              <ColumnDefinition Width="auto"/>
              <ColumnDefinition Width="auto"/>
              <ColumnDefinition Width="*"/>
              <ColumnDefinition Width="auto"/>
              <ColumnDefinition Width="auto"/>
          </Grid.ColumnDefinitions>
      
      ******
      
              <TextBox Grid.Column="2" 
                   Name="Maintext"
                   helpers:TextBoxValidationHelper.HasError="{Binding HasError}" 
                   VerticalContentAlignment="Center" 
                   VerticalAlignment="Stretch" 
                   Style="{StaticResource textBoxStyle}"                                                               
                   Language="ru-RU" >
              <Binding Path="StrValue"
                       ValidatesOnDataErrors="True"
                       ValidatesOnExceptions="True"
                       NotifyOnValidationError="True"
                            UpdateSourceTrigger="PropertyChanged" 
                            NotifyOnSourceUpdated="True"
                       ></Binding>
          </TextBox>
      
          <TextBlock Grid.Column="4" Text="!" Width="10" Foreground="Red" FontSize="16" FontWeight="Bold" TextAlignment="Center" >
      
              <TextBlock.Style>
                  <Style  TargetType="{x:Type TextBlock}">
                      <Setter Property="Visibility" Value="Collapsed"/>
                      <Style.Triggers>
                          <DataTrigger Binding="{Binding HasError}" Value="true">
                              <Setter Property="Visibility" Value="Visible"/>
                          </DataTrigger>
                      </Style.Triggers>
                  </Style>
              </TextBlock.Style>
          </TextBlock>
      

      风格

      <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
              <Style.Resources>
                  <Style x:Key="{x:Type ToolTip}" TargetType="{x:Type ToolTip}">
                      <Setter Property="Background" Value="Red"/>
                      <Setter Property="Foreground" Value="White"/>
                  </Style>
              </Style.Resources>
              <Setter Property="Validation.ErrorTemplate">
                  <Setter.Value>
                      <ControlTemplate>
                          <DockPanel LastChildFill="True">
                              <Border BorderBrush="Red" BorderThickness="2"  >
                                  <AdornedElementPlaceholder x:Name="adornedElement"/>
                              </Border>
                          </DockPanel>
                      </ControlTemplate>
                  </Setter.Value>
              </Setter>
              <Setter Property="VerticalAlignment" Value="Center"/>
              <Style.Triggers>
                  <Trigger Property="Validation.HasError" Value="true">
                      <Setter Property="Foreground" Value="Red"/>
                      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                  </Trigger>
              </Style.Triggers>
          </Style>
      

      result image

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多