WPF验证错误文本溢出

时间:2017-06-16 21:05:39

标签: c# wpf xaml

你好我是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部分有<ScrollViewer> <Grid>

      <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控件添加到第一列,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>

我在Text When names are short I can see the error messages

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

The horizontal scrollbar expands for TextBlock and TextBox  but not for the validation error message

3 个答案:

答案 0 :(得分:1)

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

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

  

放置在装饰图层中的任何内容都会呈现在您设置的任何样式的其余部分之上。换句话说,装饰者总是在视觉上位于顶部,并且无法使用z顺序覆盖。

答案 1 :(得分:0)

因为我不可能像我希望的那样按照他的答案中提到的mm8这样做。我尝试解决它并且它对我有用这种方式我向Grid添加了一个新列并使其变小(只是为了显示错误)

   <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列,这将使您能够看到验证错误文本。

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

答案 2 :(得分:0)

这对我有用

factory.addStep(
    steps.GitHub(
        repourl= util.Property('repository'), 
        mode='full',
        method='clobber', 
        submodules=True
    )
)

和样式

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

result image