さまざまなインスタンスをCanvasに動的に追加し、基になるCanvasにスケーリングLayoutTransformがあるアプリケーションがあります。これは、長方形のようなビジュアルに最適です。長方形のように、固定のストローク幅を正しく維持しますが、キャンバスがLayoutTransformで「ズーム」されると、シェイプの幅/高さが拡大します。ただし、TextBlockインスタンスの場合、レイアウト変換は実際にはテキストのレンダリングをスケーリングし、フォントを効果的に大きくします。代わりに私がしたいのは、TextBlockの左上の原点をレイアウト変換で変換し、テキストを同じサイズのままにすることです。
Canvasを作成する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インスタンス自体は、関連するバインドされたプロパティ(TextAnnotationのStartX、StartY、およびText)を持つ単純なINotifyPropertyChanged実装です。
テキストのレイアウトスケーリングを防ぐ簡単な方法を見つけることができませんでした。しかし、私が解決策への道をハッキングし始める前に、私はチェックしたいと思いました:誰かがこれを修正するためのクリーンな方法を知っていますか?