Динамическое создание предварительного просмотра окон с WPF - PullRequest
0 голосов
/ 20 июля 2011

У меня много разных окон, и все они имеют разный дизайн.Различные окна выбираются в меню.В меню есть скриншоты окон в каждом ряду.Я хотел бы найти способ и автоматизировать следующие шаги:

  1. сделать скриншот окна
  2. вставить картинку в новом окне
  3. ссылка кликhandler

Итак, на самом деле мой вопрос, возможно ли получить изображение еще скрытого окна во время выполнения

1 Ответ

1 голос
/ 20 июля 2011

Это должно дать идею.У меня есть шаблон управления для моих окон.Этот шаблон имеет элемент VisualTarget, который оборачивает все остальные элементы управления в каждом экземпляре.Поэтому приведенный ниже код работает для меня.

class ThumbnailView
{
    public Guid WindowGuid { get; set; }
    public Window ApplicationWindowInstance { get; set; }
    public Border ThumbnailVisual
    {
        get {
            return (this.ApplicationWindowInstance.
                            Template.FindName("VisualTarget", 
                            this.ApplicationWindowInstance) as Border);
        }
    }
}

<Border BorderThickness="0,0,0,0" Cursor="Hand">
    <Border.Background>
        <VisualBrush Visual="{Binding ThumbnailVisual}"/>
    </Border.Background>
</Border>


Редактировать: вот что-то более общее
ObservableCollection<WindowInstance> _windows = new ObservableCollection<WindowInstance>();

class WindowInstance
{
    public Window CurrentWindowInstance { get; set; }
    public DependencyObject CurrentVisual {
        get {
            return VisualTreeHelper.GetChild(CurrentWindowInstance, 0);
        }
    }
}

<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel></StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="0,0,0,0" Width="50" Height="50">
                <Border.Background>
                    <VisualBrush Visual="{Binding CurrentVisual}"/>
                </Border.Background>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>


Редактировать: в приведенных выше примерах используются живые визуальные кисти, которые могутпривести к снижению производительности.Ниже приведен ответ для замороженных миниатюр окон.
ObservableCollection<BitmapFrame> _windowCaptures = new ObservableCollection<BitmapFrame>();

TestWindow testWindow = new TestWindow();
RenderTargetBitmap bitmap = new RenderTargetBitmap((int)testWindow.Width, (int)testWindow.Height, 96, 96,
                                        PixelFormats.Pbgra32);
bitmap.Render((Visual)VisualTreeHelper.GetChild(testWindow, 0));
_windowCaptures.Add(BitmapFrame.Create(bitmap));

<ItemsControl ItemsSource="{Binding}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel></StackPanel>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Image Height="100" Width="100" Source="{Binding}"></Image>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...