在WriteableBitmap中渲染UserControl + ItemsControl时没有DataBinding?

时间:2011-12-24 20:41:04

标签: windows-phone-7 silverlight-3.0 windows-phone-7.1

我想使用WriteableBitmap将以编程方式实例化的UserControl呈现为jpg / png图像,以将其用作Windows Phone 7.1项目中的实时图块背景图像,但在呈现控件时DataBinding无法按预期工作。 / p>

通常,UserControl是这样的:

<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并将包含我的数据结构项的列表分配给UserControl的DataContext属性时,一切正常,我看到每个列表项有一个TextBlock,TextBlock的Text属性是正确显示我的数据结构的属性值。网格上的最后一个TextBlock也正确显示列表项的当前计数。

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

以下是我创建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中的DataBindings有什么问题?如何解决?

1 个答案:

答案 0 :(得分:0)

我认为,您的控件尚未完全创建,并且您无法在创建后立即获取位图。尝试使用Dispatcher.BeginInvoke或其他内容来延迟抓取图像。

此外,将此控件添加到您的页面并查看问题所在 - 在控件创建或位图中?这为您提供了有关问题的更多信息。