我有一个应用程序,我在其中动态地将各种实例添加到 Canvas,并且底层 Canvas 具有缩放 LayoutTransform。这对于像矩形这样的视觉效果非常有用,它们正确地保持固定的笔划宽度,但随着画布使用 LayoutTransform 进行“缩放”,形状宽度/高度会扩大。然而,对于 TextBlock 实例,布局转换实际上是缩放文本的呈现,使字体有效地变大。我希望发生的事情是让 TextBlock 的左上角原点与布局转换一起翻译,文本保持相同的大小。
这是创建画布的 ItemsControl 的 XAML:
<ItemsControl ItemsSource="{Binding Annotations}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding StartX}"/>
<Setter Property="Canvas.Top" Value="{Binding StartY}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.LayoutTransform>
<TransformGroup>
<ScaleTransform ScaleX="{Binding ZoomScale}" ScaleY="{Binding ZoomScale}"
CenterX="0.5" CenterY="0.5"/>
</TransformGroup>
</ItemsControl.LayoutTransform>
</ItemsControl>
以下是一些从绑定集合呈现注释的数据模板:
<DataTemplate DataType="{x:Type Annotations:RectangleAnnotation}">
<Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="Blue" IsHitTestVisible="False"/>
</DataTemplate>
<DataTemplate DataType="{x:Type Annotations:TextAnnotation}">
<TextBlock Text="{Binding Text}" Foreground="Orange" IsHitTestVisible="False"/>
</DataTemplate>
Annotation 实例本身是简单的 INotifyPropertyChanged 实现,具有相关的绑定属性(TextAnnotation 的 StartX、StartY 和 Text。)
我还没有找到任何简单的方法来防止文本的布局缩放。但是,在我开始破解解决方案之前,我想我会检查一下:有人知道解决这个问题的干净方法吗?