2011-03-23 47 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); 
    } 
}