1

ユーザーが範囲外の可能性のあるデータの配置を回避できるように、ページの印刷マージンを表す単純なビジュアルをアプリケーションに追加しようとしています。これを行うには、用紙サイズ、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の問題であるという点を除いて、これでどこが間違っているのかわかりません。考え?私の間違いを見つけますか?

ありがとう :)

4

1 に答える 1

0

DataTemplateのDataTypeが間違っているようです。GetMargins()はRectのObservableCollectionを返しますか?次に、DataTemplateがPageクラスに対して定義されている間に、RectからListboxItemsが作成されます。

于 2012-08-03T16:03:47.827 に答える