Adorner เทมเพลตข้อผิดพลาดในการตรวจสอบถูกตัดข้อมูลเชิงลึกจาก ScrollViewer

ฉันมีปัญหาต่อไปนี้ เท่าที่ฉันใส่กล่องข้อความของฉันไว้ใน scrollviewer ValidationError Adorner ของฉันถูกตัดโดย ScrollViewer ฉันพบคำตอบสำหรับ Adorner และ ScrollViewer ซึ่งบอกว่าฉันต้องสร้าง scrollviewer ใหม่และเพิ่ม adornerdecorator แต่สิ่งนี้ไม่สมเหตุสมผลสำหรับฉันและก็ไม่ได้ช่วยอะไรเช่นกัน เท่าที่ฉันรู้ Validation Adorner ควรแสดงผลใน 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 สำหรับเนื้อหาดังกล่าวที่ไม่ได้ถูกตัดออก ส่งผลให้เกิด UI ที่แปลก

สิ่งที่คุณควรทำได้ใน ValidationTemplate คือการวางองค์ประกอบ Grid ไว้ในตัวควบคุม Popup โปรดลองและรายงานว่าใช้งานได้

person Markus Hütter    schedule 22.04.2011
comment
เพียงแค่ย้ายหน้าต่าง :) ป๊อปอัปยังคงอยู่และผู้ตกแต่งจะเคลื่อนไหวไปพร้อมกับคุณ - person blindmeis; 31.07.2013
comment
ฉันเห็นด้วย ป๊อปอัปไม่ใช่วิธีแก้ปัญหาสำหรับเรื่องนั้นจริงๆ! - person OliverAssad; 25.06.2015