2011-03-23 32 views
0

因此,这里是senerio。如何执行System.Windows.Application的外部和实例的DataBinding

我想建立与嵌入式从数据库中的图像上的文本图像库。

我试图通过具有template.xaml文件,并在ClassLibrary项目实例它这样做。因此,xaml文件正在WPF应用程序的范围之外实例化。

我想创建一个PivotCollection有点像在这个环节

http://martimedia.blogspot.com/2010/07/creating-pivot-collection.html

我结束了在我的类库从System.Windows.Application继承得到这个工作解释,但事实远非因为它引发了关于所使用的AppDomain的问题。

我已经knoced了一些简单的示例代码简单地展示一下我想才达到。

下面是一个简单的POCO,我想结合。

public class DataObject { 
    public DataObject(string value) { 
     Property = value; 
    } 
    public string Property { get; set; } 
} 

这是我想绑定的一个简单的'图像模板'。

<UserControl x:Class="XamlRenderingExample.Template" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
    <TextBlock Text="{Binding Property}"></TextBlock> 
    </Grid> 
</UserControl> 

下面是一个简单类库来从XAML创建图像

public class CreateBitmapImagesFromXamlTemplate { 
    public CreateBitmapImagesFromXamlTemplate() { 
    Template template = new Template(); 
    foreach (DataObject obj in GetDataObjects()) 
    { 
     template.DataContext = obj; 
     RenderXamlAsBitMap(template); 
    } 
    } 

    private void RenderXamlAsBitMap(Template template) { 
    template.Arrange(new Rect(0, 0, 300, 300)); 
    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)template.RenderSize.Width, 
         (int)template.RenderSize.Height, 
         96, 
         96, PixelFormats.Default); 
    bitmap.Render(template); 
    // Save away the bitmap to file. 
    } 

    private static List<DataObject> GetDataObjects() { 
    return new List<DataObject>() 
    { 
     new DataObject("Hello"), 
     new DataObject("Another string") 
    }; 
    } 
} 

的问题是,不添加的Xaml到渲染窗口在WPF应用程序设置的datacontext将不执行所期望的绑定,结果是textBlock不会显示来自DataObject的数据。

按我的理解,如果我们是在一个WPF应用程序和模板添加到渲染窗口当我设置模板作业在调度QUED达到实际执行databidning从拉动值在DataContext数据对象到模板。

我想要做的是能在我的类库,而无需实例化对象System.Windows.Application手动执行此程序。

任何人有任何想法?

回答

0

之后就这个问题和实现是什么让我的第一个解决方案的工作是不是添加了用户控制到应用程序对象的可视化树,但对调度工作的queing一些进一步的修修补补。

我已经修改上面的类阙了其现在执行使用以下代码所保存的图像上期望的“绑定”的作业:

public class CreateBitmapImagesFromXamlTemplate { 
    Template template; 
    RenderTargetBitmap bitmap; 

public CreateBitmapImagesFromXamlTemplate() { 
    template = new Template(); 

    foreach (DataObject obj in GetDataObjects()) { 
     RenderXamlAsBitMap(template, obj); 
    } 
} 

private void RenderXamlAsBitMap(Template template, DataObject dataObject) { 
    var renderFrame = new DispatcherFrame(true); 
    QueueDataBinding(dataObject, renderFrame); 
    QueueRenderBitmap(renderFrame); 
    System.Windows.Threading.Dispatcher.PushFrame(renderFrame); 
    SaveRenderedBitmap(bitmap); 
} 

private static List<DataObject> GetDataObjects() { 
    return new List<DataObject>() { 
    new DataObject("Hello"), 
     new DataObject("Another string") 
    }; 
} 

private void SaveRenderedBitmap(RenderTargetBitmap renderedBitmap) { 
    var encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(renderedBitmap)); 
    using (FileStream fs = File.Open(@"C:\temp\imageTesting.jpg", 
     FileMode.OpenOrCreate)) { 
      encoder.Save(fs); 
     } 
    } 

    private void QueueDataBinding(DataObject dataObject, 
    DispatcherFrame renderFrame) { 
     Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.DataBind, 
      (ThreadStart)delegate() { 
      template.DataContext = dataObject; 
      renderFrame.Continue = true; 
    }); 
} 

private void QueueRenderBitmap(DispatcherFrame renderFrame) { 
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, 
     (ThreadStart)delegate() { 
     RenderBitmap(); 
     renderFrame.Continue = false; 
     }); 
    } 

    private void RenderBitmap() { 
     template.Arrange(new Rect(0, 0, 300, 300)); 
     bitmap = new RenderTargetBitmap((int)template.RenderSize.Width, 
      (int)template.RenderSize.Height, 
      96, 
      96, PixelFormats.Default); 
     bitmap.Render(template); 
     SaveRenderedBitmap(bitmap); 
    } 
}