Нет привязки данных при рендеринге UserControl + ItemsControl в WriteableBitmap? - PullRequest
0 голосов
/ 25 декабря 2011

Я хочу использовать WriteableBitmap для рендеринга программно созданного UserControl в изображение jpg / png, чтобы использовать его в качестве живого фонового изображения плитки в проекте Windows Phone 7.1, но DataBinding не работает должным образом при отображении элемента управления.

В общем, 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 и назначаю список с элементами моей структуры данных свойству DataContext UserControlвсе работает нормально, и я вижу один TextBlock для каждого элемента списка, и свойство Text этого TextBlock правильно отображает значение свойства моей структуры данных.Также последний текстовый блок в сетке правильно отображает текущее количество элементов списка.

НО, когда я сейчас пытаюсь программно создать этот UserControl, назначьте тот же список DataContext и затем используйте WriteableBitmap для его рендерингачто касается файла изображения, то кажется, что все DataBindings в DataTemplate ItemsControl больше не работают, теперь они отображают FallbackValue.Хотя DataBinding внешнего TextBlock в Grid по-прежнему работает отлично, а также я получил правильное количество TextBlocks в StackPanel (= элементов в связанном списке).

Вот мой код для создания 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();

В чем проблема с привязками данных в DataTemplate при рендеринге через WriteableBitmap и как я могу ее решить?

1 Ответ

0 голосов
/ 25 декабря 2011

Я думаю, что ваш элемент управления еще не полностью создан, и вы не можете получить растровое изображение сразу после создания.Попробуйте использовать Dispatcher.BeginInvoke или что-то еще для отложенного захвата изображения.

Кроме того, добавьте этот элемент управления на свою страницу и посмотрите, в чем проблема - в создании элемента управления или в растровом изображении?Это даст вам больше информации о проблеме.

...