使用WPF生成动态窗口预览

时间:2011-07-20 12:38:05

标签: c# wpf

我有许多不同的窗户,它们都有不同的设计。在菜单中选择不同的窗口。菜单中包含每行窗口的屏幕截图。我想找到一种方法并自动化以下步骤:

  1. 制作窗口的屏幕截图
  2. 在新窗口中插入图片
  3. 链接点击处理程序
  4. 所以,实际上我的问题是,是否有可能在运行时获取隐藏窗口的图像

1 个答案:

答案 0 :(得分:1)

这应该给出这个想法。我的窗户有一个控件模板。此模板具有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>