【发布时间】:2011-03-11 12:02:51
【问题描述】:
更新二 问题是solved。谢谢。
对于一个简单的 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(...) 方法不会返回预期值,项目的高度始终为零。也不起作用:保留文本绑定并覆盖 DataItems ToString() 方法。查看工作,Measure 没有。
然后我试图在 DataTemplate 或整个页面上使用 InvalidateMeasure() 或 UpdateLayout() 等方法强制重新计算,但没有成功。
你能解释一下吗?
更新
有趣的是:出于调试原因,我将一个简单的自定义 ValueConverter 附加到 TextBlock 的绑定中。当 string 对象被绑定时,我可以看到 Measure(...) 正在触发绑定 - 它首先被解决(我可以看到调试器进入 ValueConverter)然后测量。但是当如上所述绑定自定义类时,Measure(...) 不会触及绑定,我会“稍后”进入ValueConverters 断点。 (必须找出确切的时间)
这对您有任何帮助吗?
【问题讨论】:
标签: silverlight silverlight-4.0 printing measure