XAML: اجعل scrollviewer عرض أشرطة التمرير عندما يصبح حجم كائن الطفل كبيرًا

StackOverflow https://stackoverflow.com/questions/2394370

سؤال

أقوم بعمل عنصر تحكم "معاينة الطباعة" لبعض المستندات في تطبيق Silverlight 3 الخاص بي. لديّ قماش (لعرض المستند) داخل جهاز ScrollViewer ، ولديّ تصغير / تكبير الأزرار التي تتحكم في خصائص مقياس X و Y الخاص بخاصية Canvas.RenderTransform. أريد أن تظهر أشرطة التمرير الخاصة بـ ScrollViewer عندما "أقوم بتكبير" بما يكفي بحيث لم تعد اللوحة مرئية في منطقة ScrollViewer ، لكن يبدو أنها تظهر فقط اعتمادًا على عرض/ارتفاع اللوحة نفسها ، بغض النظر ما إذا كان يتم تكبيره أم لا.

هل أستطيع مساعدتك؟

هل كانت مفيدة؟

المحلول

نعم ، المشكلة هي أنه لا يوجد LayoutTransform في Silverlight. هناك بعض الحلول في هذه المشكلة المدرجة هنا.

الفكرة هنا هي توفير قماش وسيط يتم تغيير حجمه ونتيجة لذلك ، يقيم المنطقة القابلة للتمرير. على سبيل المثال ، إذا كان لدي XAML التالي:

<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="200" />
        <RowDefinition Height="25" />
    </Grid.RowDefinitions>
        <ScrollViewer Grid.Row="0" x:Name="sc" VerticalScrollBarVisibility="Auto" 
                      HorizontalScrollBarVisibility="Auto" Width="200" Height="200" >
        <Canvas x:Name="sizer" Width="200" Height="200">
            <Rectangle x:Name="gradientRect" Width="200" Height="200">
            <Rectangle.RenderTransform>
                <ScaleTransform ScaleX="1" ScaleY="1"/>
            </Rectangle.RenderTransform>
                <Rectangle.Fill>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                        <GradientStop Color="Red" Offset="0.1"/>
                        <GradientStop Color="Yellow" Offset="0.5"/>
                        <GradientStop Color="Red" Offset="0.9"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
        </Canvas>
    </ScrollViewer>
    <Button Grid.Row="1" Content="Multiply by Two" Click="ScaleRect" Width="100" Height="25"></Button>
</Grid>

ستلاحظ أنني وضعت <Canvas x:Name="sizer"/> بين ال <ScrollViewer/> و <Rectangle/> وحدث النقر من ScaleRect في ال <Button/>.

ال ScaleRect Sub Subs Simply the Rectangle بمقدار 2. ثم يتم استخدام هذه القيمة لتغيير sizer Width و Height, ، وبالتالي تحديث أشرطة التمرير الخاصة بـ ScrollViewer. ها هو الفرع ل ScaleRect:

Private Sub ScaleRect(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim zoom As Double = 2.0
    Dim scaleX = gradientRect.RenderTransform.GetValue(ScaleTransform.ScaleXProperty)
    Dim scaleY = gradientRect.RenderTransform.GetValue(ScaleTransform.ScaleYProperty)
    gradientRect.RenderTransform.SetValue(ScaleTransform.ScaleXProperty, scaleX * zoom)
    gradientRect.RenderTransform.SetValue(ScaleTransform.ScaleYProperty, scaleY * zoom)
    sizer.Height *= zoom
    sizer.Width *= zoom
End Sub
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top