ОБНОВЛЕНИЕ II Проблема была решена .Спасибо.
Для простого механизма предварительного просмотра печати Silverlight мой XAML выглядит следующим образом (отрывок):
<Grid>
<TextBlock Text="{Binding IntroText}" />
<ItemsControl ItemsSource="{Binding DataItems}"
x:Name="DataItemsControl">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"
TextWrapping="Wrap"
Margin="0,2" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<TextBlock Text="{Binding OutroText}" />
</Grid>
Я хочу убедиться, что все помещается на странице, поэтомуУ меня есть простой метод:
public bool FitsOnPrintPage(Size pageDimensions)
{
Measure(new Size(pageDimensions.Width, Double.PositiveInfinity));
return
DesiredSize.Height <= pageDimensions.Height &&
DesiredSize.Width <= pageDimensions.Width;
}
Теперь у нас есть странная проблема, которую я не могу объяснить:
Связанная коллекция DataItems
является общим object
списком.При использовании простых строк метод Measure(...)
работает как положено и возвращает правильно вычисленный DesiredSize
.Пока что все работает.
Однако, если у вас есть простой объект, подобный этому ...
public class DataItem
{
public string Value1 { get; set; }
public string Value2 { get; set; }
}
... и при изменении привязки TextBlock на <TextBlock Text="{Binding Path=Value1}"...
результирующее представлениеидентичен, однако метод Measure(...)
не возвращает ожидаемые значения, высота элементов всегда равна нулю.Также не работает: оставьте Text Binding и переопределите метод DataItem
s ToString()
.Просмотр работает, измерение - нет.
Затем я пытался принудительно пересчитать, используя такие методы, как InvalidateMeasure()
или UpdateLayout()
на DataTemplate или на всей странице, но безуспешно.
МожетВы объясняете это?
ОБНОВЛЕНИЕ
Интересно: я прикрепил простой пользовательский ValueConverter
к привязке TextBlock только для отладки.Когда объект string
привязан, я вижу, что Measure(...)
запускает привязку - сначала она разрешается (я вижу, как отладчик входит в ValueConverter), а затем измеряется.Но при привязке пользовательского класса, как описано выше, Measure(...)
не касается Binding, я вхожу в точку останова ValueConverter
«позже». (Нужно выяснить, когда именно)
Помогает ли это вам как-нибудь?