2011-12-24 35 views
0

我想要使用WriteableBitmap来以编程方式将实例化的UserControl呈现为jpg/png图像,以将其用作Windows Phone 7.1项目中的活动拼贴背景图像,但DataBinding在呈现控件时未按预期工作。在WriteableBitmap中呈现UserControl + ItemsControl时没有DataBinding?

在一般情况下,用户控件是这样的:

<UserControl> 
    <Grid x:Name="LayoutRoot" Height="173" Width="173" > 
    <Grid.Background > 
     <SolidColorBrush Color="{StaticResource PhoneAccentColor}" /> 
    </Grid.Background > 
    <Grid.RowDefinitions> 
     <RowDefinition Height="27"/> 
     <RowDefinition Height="146"/> 
    </Grid.RowDefinitions > 
    <ItemsControl Grid.Row="1" Margin="10,0,0,0" ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
      <TextBlock Text="{Binding MyBindingProperty, FallbackValue=xxx}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     </ItemsControl> 
     <TextBlock Text="Hello World" FontSize="22" Margin="5,0,0,0"/> 
     <TextBlock TextWrapping="Wrap" Text="{Binding Count, FallbackValue=-1}" FontSize="18.667" Margin="123,0,0,0"/> 
    </Grid> 
</UserControl> 

当我现在把这个控制到的PhoneApplicationPage,并指定我的数据结构的项目的用户控件,一切正常的DataContext属性列表很好,我看到每个列表项的一个TextBlock,并且该TextBlock的Text属性正确显示了我的数据结构的属性值。网格上的最后一个TextBlock也正确显示了列表项的当前计数。

但是当我现在试图以编程方式创建UserControl时,将相同的列表分配给DataContext,然后使用WriteableBitmap将其呈现给图像文件,似乎ItemsControl的DataTemplate中的所有DataBindings都不是'工作了,他们现在正在显示FallbackValue。虽然Grid中外部TextBlock的DataBinding仍然可以正常工作,并且我在StackPanel(=绑定列表中的项目)中获得了正确数量的TextBlocks。

这里是我创建的WriteableBitmap的代码:

var tile = new MyTileControl { DataContext = this._myList }; 
tile.Arrange(new Rect(0, 0, 173, 173)); 
tile.Measure(new Size(173, 173)); 

var bmp = new WriteableBitmap(173, 173); 
bmp.Render(tile, null); 
bmp.Invalidate(); 

什么是通过一个WriteableBitmap的渲染,我怎么能解决这个问题时,在DataTemplate中的数据绑定的问题?

回答

0

我想,你的控件还没有完全创建,你不能在创建后抓取位图。尝试使用Dispatcher.BeginInvoke或其他用于延迟抓取图像的东西。

此外,将此控件添加到您的页面并查看问题的位置 - 在控件创建或位图中?这给你更多关于问题的信息。