c# - كيفية نسخ فريميليمنت بما في ذلك محتوى فائض؟



wpf xaml (1)

أنا باستخدام بعض التعليمات البرمجية التي وجدت في http://brianlagunas.com/wpf-copy-uielement-as-image-to-clipboard/ لنسخ زمل تريفيو المقدمة. تم تكوين تريفيو للتمرير إذا تجاوز المحتوى الارتفاع المتاح.

const long DPI = 96;
FrameworkElement element = (FrameworkElement)param;
double height = element.ActualHeight;
double width = element.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap((int)Math.Round(width), (int)Math.Round(height), DPI, DPI, PixelFormats.Default);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
    VisualBrush vb = new VisualBrush(element);
    dc.DrawRectangle(vb, null, new Rect(new Point(), new Size(width, height)));
}
bmp.Render(dv);

DataObject _data = new DataObject();
_data.SetImage(bmp);

هذا يعمل بشكل جيد عندما يناسب المحتوى الخاص بي داخل منطقة العميل:

ولكن الأمر ينطوي على مشكلة عندما يتجاوز المحتوى مساحة العميل:

هل هناك طريقة يمكنني من خلالها الحصول على محتوى التحكم بالكامل بدون الحاجة إلى تغيير حجم العنصر الذي يظهر على الشاشة؟

تحرير: وهنا تريفيو زمل:

    <TreeView x:Name="ProjectTree" Grid.Row="1"
              ItemContainerStyle="{StaticResource ShinyTreeView}"
              HorizontalContentAlignment="Stretch"
              MouseDoubleClick="TreeView_OnMouseDoubleClick"
              Style="{StaticResource CodeExplorerTreeViewStyle}" BorderThickness="0,1"
              VirtualizingPanel.IsVirtualizing="False">
        <i:Interaction.Behaviors>
            <controls:BindableSelectedItemBehavior SelectedItem="{Binding SelectedItem, Mode=TwoWay}" />
        </i:Interaction.Behaviors>
    </TreeView>

والزر الذي يربط تريفيو بأمر الزر:

            <Button Command="{Binding CopyResultsCommand}" CommandParameter="{Binding ElementName=ProjectTree}">
                <Image Height="16" Source="../../Resources/document-copy.png" />
                <Button.ToolTip>
                    <TextBlock Text="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=CodeExplorer_CopyToolTip}" />
                </Button.ToolTip>
            </Button>

فعلت بعض التجريب مع التعليمات البرمجية. ويبدو أن المشكلة هي أن كنت تستخدم element.ActualHeight . element.ActualWidth لإنشاء الصورة النقطية، والتي بالطبع يساوي الحجم الحالي للتحكم تريفيو (وليس لوحة المحتوى الذي هو في الواقع أطول)، لذلك هذا ما كنت الحصول على المقدمة في الإخراج.

ما فعلته لإصلاح المشكلة كان تعيين ScrollViewer.VerticalScrollBarVisibility إلى Disabled ل ScrollViewer.VerticalScrollBarVisibility ثم التفاف عليه داخل ScrollViewer . وهذا سيجعل TreeView الخاص بك كامل الارتفاع التي يتطلبها ولا يزال وجود شريط التمرير للتمرير من خلال ذلك. الآن عند إنشاء الصورة النقطية الخاصة بك باستخدام أكتوالويدث و أكتوالهيت، يمكنك الحصول على الصورة النقطية بالحجم الكامل وجعله يعطي النتيجة المرجوة.





drawing