2

MVVM パターンを使用して、ベクター CAD アプリケーションと同じように、Canvas に線とテキストを書きたいと思います。これを調査する中で、次のように、Canvas として宣言された ItemsPanelTemplate で ItemsControl を使用する必要があると結論付けました。

<ItemsControl>
   <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <Canvas/>
      </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
</ItemsControl>

私はまた、そうのように、ItemTemplateに何かを入れる必要があることも理解しました(何がわからない)。. .

  <ItemsControl.ItemTemplate>
     <DataTemplate>
         <!--  Don't know what goes here -->
     </DataTemplate>
  </ItemsControl.ItemTemplate>

私の質問

ViewModelにバインドし、ViewModelにテキスト(任意の回転、任意のフォントなど)、線、円弧、ベジェ、形状のいずれかを描画させるために、DataTemplateに何を入れるかについて誰かアドバイスしてもらえますか-- -バインドされたコレクション内のさまざまな種類の要素に応じて必要なものは何ですか?

私の推測では、それは System.Windows.FrameworkTemplate である必要がありますが、私はまだそれを使用する方法を理解しようとしており、遅いです。それとも、ContentControl と Presenter でしょうか。

参考文献

ItemsControl 使用時に X/Y 位置を Canvas Left/Top プロパティに変換する方法

ViewModel を ItemsControl に配置するにはどうすればよいですか

Canvas の Children プロパティを XAML でバインドすることは可能ですか? 注:これに関する2番目の回答を参照してください。

4

1 に答える 1

2

さまざまな方法があります。

セレクターに基づいてDataTemplatesを切り替えることができます。

public class ImgStringTemplateSelector : DataTemplateSelector
{
  public DataTemplate ImageTemplate { get; set; }
  public DataTemplate StringTemplate { get; set; }

  public override DataTemplate SelectTemplate(object item,
    DependencyObject container)
  {
    String path = (string)item;
    String ext = System.IO.Path.GetExtension(path);
    if (System.IO.File.Exists(path) && ext == ".jpg")
      return ImageTemplate;
    return StringTemplate;
  }

あなたはItemsPanelItemTemplateSelectorを通してそれを参照することができます。Sch as ItemTemplateSelector ="{StaticResourceImgTemplateSelector}"。その中で、返すテンプレートを選択します。

Lineテンプレート、Arcテンプレートなどを返すことができます。とても簡単です。

もう1つのトリックは、基本クラスのDrawingObjectを作成し、そこから派生させることができることです。ArcObj:DrawingObject、

後で追加するだけです

<DataTemplate Datatype="{x:Type ArcObj"}>
<Arc Canvas.Left="{BInding X}", Canvas.Top="{Binding Y}" />
</DataTemplate>

等々。

于 2012-10-08T06:00:16.567 に答える