Ошибка проверки шаблона Adorner вырезана из ScrollViewer

у меня следующая проблема. насколько я помещаю свои текстовые поля в прокрутку, мой ValidationError Adorner обрезается ScrollViewer. я нашел несколько ответов на Adorner и ScrollViewer, в которых говорится, что мне нужно изменить шаблон моего прокрутки и добавить adornerdecorator. но это не имеет смысла для меня, и это также не помогает. насколько я знаю, должен ли Adorner Validation отображаться в ближайшем AdornerDecorator. ScrollViewer по умолчанию не имеет AdornerDecorator. так кто-нибудь знает, почему мой ValidationAdorner обрезается?

Я тоже ищу решение :)

РЕДАКТИРОВАТЬ: кажется, что ScrollContentPresenter, который исходит из шаблона ScrollViewer, вызывает проблему, потому что по умолчанию он имеет AdornerLayer. Любые идеи, как решить мою проблему?

РЕДАКТИРОВАТЬ2:

  • есть ли способ создать новый шаблон ScrollConntentPresenter без Adornerlayer?
  • или есть способ удалить Adornerlayer из VisualTree?
  • или я могу заставить Adornerlayer отображать в «более высоком/самом верхнем» AdornerLayer?
  • или я могу иметь прокручиваемый контент без ScrollViewer?

вот мой xaml:

<UserControl>
  <AdornerDecorator>
    <Grid x:Name="RootControl">
       <Grid.RowDefinitions>
          <RowDefinition Height="auto" MinHeight="50"/>
          <RowDefinition Height="*"/>
       </Grid.RowDefinitions>

       <Grid x:Name="main" Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <Border x:Name="InputBorder" Grid.Column="0">
                <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
                    <Grid x:Name="InputContainer" HorizontalAlignment="Stretch">
                        <Grid.RowDefinitions>
                            ...some rows...
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            ...some columns...
                        </Grid.ColumnDefinitions>

                        <TextBox .../><!--this Validation Adorner get cut by scrollviewer-->

                   </Grid>
                </ScrollViewer> 
            </Border>
       </Grid>
    </Grid>
  </AdornerDecorator>
</UserControl>

вот мой шаблон проверки:

<ControlTemplate x:Key="ValidationTemplate" >
    <DockPanel>
        <AdornedElementPlaceholder Name="MyAdornedElement" />
        <Grid>
            <Border Background="{StaticResource BrushError}" Margin="3,0,0,0" x:Name="ErrorControl" BorderBrush="White" BorderThickness="1">
                <TextBlock Margin="10,3,5,2" 
                        Text="{Binding ElementName=MyAdornedElement,Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}" 
                       Visibility="{Binding ElementName=MyAdornedElement,Path=AdornedElement.Visibility}"
                       Foreground="White" FontWeight="Bold">
                </TextBlock>
            </Border>
            <Path x:Name="path"  Margin="3,0,0,0" Data="M 0,10 L 10,0 " Fill="{StaticResource BrushError}"
                        StrokeThickness="2" Stroke="White"
                        />
        </Grid>
    </DockPanel>
</ControlTemplate>

person blindmeis    schedule 21.04.2011    source источник


Ответы (1)


поведение предназначено. ScrollViewer может скрыть часть своего содержимого (т.е. содержимое, лежащее в экстенте). Отображение Adorner для такого контента, который не обрезается, приводит к странному пользовательскому интерфейсу.

Что вы должны уметь делать в ValidationTemplate, так это помещать элемент Grid внутрь элемента управления Popup. Пожалуйста, попробуйте это и сообщите, если это сработало.

person Markus Hütter    schedule 22.04.2011
comment
просто переместите окно :) всплывающее окно остается, а украшение перемещается вместе с вами. - person blindmeis; 31.07.2013
comment
Я согласен, всплывающее окно на самом деле не решение для этого! - person OliverAssad; 25.06.2015