ユーザーが範囲外の可能性のあるデータの配置を回避できるように、ページの印刷マージンを表す単純なビジュアルをアプリケーションに追加しようとしています。これを行うには、用紙サイズ、DPI、およびマージン設定情報を取得し、それを使用して、ページの各端に1つずつ、合計4つのRectを含むObservableCollection(Rectの)を作成するメソッドがあります。XAMLのListBoxは、コレクションを返すGetMargins()プロパティを介してコレクションにバインドされます。リストボックスをホストするグリッドのリソースセクションでページのデータテンプレートを定義しました。リストボックスはItemsPanelTemplateでキャンバスを使用するため、各長方形のx、y、幅、高さを使用して、ページ上のいくつかの長方形を配置およびサイズ変更できます。 。XAMLは次のとおりです。
Grid.Resourcesの場合:
<!--
A data template for the page margins.
-->
<DataTemplate DataType="{x:Type local:Page}">
<Grid>
<Rectangle
Width="{Binding Width}"
Height="{Binding Height}"
Fill="LightGreen"
Opacity="0.5"
/>
</Grid>
</DataTemplate>
グリッド内:
<!--
Listbox to present the page margins.
-->
<ListBox
x:Name="PageMarginsListBox"
ItemsSource="{Binding GetMargins}"
Background="Transparent"
IsHitTestVisible="False"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter
Property="Canvas.Left"
Value="{Binding X}"
/>
<Setter
Property="Canvas.Top"
Value="{Binding Y}"
/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
アプリケーションを実行すると、上記のコードにより、ページの境界にある薄緑色の長方形ではなく、文字列が出力されます。たとえば、左側の余白の長方形は、幅75ピクセルでページ全体の高さにまたがる長方形ではなく、「0,0,75,1650」と表示されます。予想どおり、下マージン文字列は左下隅に配置され、右マージンは右上隅に表示されます。したがって、バインディングは機能しており、正しく配置されていますが、何らかの理由で描画されていません。
これについて私が興味深いと思うのは、ページの表面上でほぼ同じ方法で配置およびスタイル設定された、独自のデザインのオブジェクトで満たされた別のObservableCollectionがあることです。そのコレクションにバインドされたListBoxのXAMLはまったく同じ方法で設定されますが、アイテムごとにやや複雑なDataTemplateが使用されます(1つではなく9つの長方形)。それは非常にうまく機能します。どちらも同じグリッドに住んでいます。
したがって、toString()出力を取得している場合は、おそらくDataTemplateの問題であるという点を除いて、これでどこが間違っているのかわかりません。考え?私の間違いを見つけますか?
ありがとう :)