UPDATE 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 Binding 更改<TextBlock Text="{Binding Path=Value1}"...
为结果视图是相同的,但是该Measure(...)
方法不返回预期值,项目的高度始终为零。也不起作用:保留 Text Binding 并覆盖DataItem
sToString()
方法。查看工作,测量没有。
然后我试图使用DataTemplate 或整个页面上的 或 之类的方法强制重新计算,但没有成功InvalidateMeasure()
。UpdateLayout()
你能解释一下吗?
更新有趣:出于调试原因,
我已将一个简单的自定义附加到 TextBlock 的绑定中。ValueConverter
当一个string
对象被绑定时,我可以看到它Measure(...)
正在触发绑定 - 它首先被解决(我可以看到调试器进入 ValueConverter)然后测量。但是,当如上所述绑定自定义类时,Measure(...)
不会触及绑定,我会“稍后”进入ValueConverter
s 断点。(必须找出确切的时间)
这对您有任何帮助吗?