WPF Toile de mise à l'Échelle/Transformer pour s'Adapter à

Je suis reposter cette question que je n'ai pas eu beaucoup de réponse de la dernière fois, espérons-le, un peu de re-formulation pourrait aider...

Essentiellement ce que je suis en train de faire est de créer un lié aux données de la toile, qui s'adaptera automatiquement à son contenu de "remplissage" de l'espace disponible. Comme une sorte de zoom sur l'opération. Malheureusement, mon WPF compétences ne sont pas encore très forte, et j'ai du mal à travailler sur la façon de faire cette dernière partie. J'ai suivi quelques exemples de liaison de données pour obtenir la toile lié, mais pas sûr si peut-être son erreur et d'entraver moi.

J'ai deux problèmes fondamentaux pour le moment en fonction de la façon dont je l'ai essayer et de s'attaquer à la solution, soit:

  • Je ne sais pas comment faire le
    toile de re-échelle automatiquement
    par le biais de XAML si ses possible à l'aide d'un
    transformer.
  • Je n'arrive pas à
    référence de la toile dans le derrière
    code, je suppose parce que sa partie
    d'un ItemsControl?

Un exemple de ce que je suis en train de réaliser, j'en ai Un, je veux essayer et obtenir B:

(retiré expiré le lien à un img)

Le code que j'utilise actuellement est assez simple, il suffit de la création de 4 points avec une coordination et un autre modèle de vue de les emballer.

public class PointCollectionViewModel
{
    private List<PointViewModel> viewModels;
    public PointCollectionViewModel()
    {
        this.viewModels = new List<PointViewModel>();
        this.viewModels.Add(new PointViewModel(new Point(1, 1)));
        this.viewModels.Add(new PointViewModel(new Point(9, 9)));
        this.viewModels.Add(new PointViewModel(new Point(1, 9)));
        this.viewModels.Add(new PointViewModel(new Point(9, 1)));
    }

    public List<PointViewModel> Models
    {
        get { return this.viewModels; }
    }
}

public class PointViewModel
{
   private Point point;
   public PointViewModel(Point point)
   {
       this.point = point;
   }

   public Double X { get { return point.X; } }
   public Double Y { get { return point.Y; } }
}

Puis le PointCollectionViewModel est utilisé comme DataContent pour mon AutoResizingCanvas, qui a le code XAML suivant pour mettre en œuvre la liaison:

<UserControl x:Class="WpfCanvasTransform.AutoResizingCanvas"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCanvasTransform"
    x:Name="parent">
    <ItemsControl x:Name="itemsControl" ItemsSource="{Binding Path=Models}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
        <Canvas x:Name="canvas" Background="DarkSeaGreen" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Canvas.LayoutTransform>
            <ScaleTransform ScaleY="-1" />
            </Canvas.LayoutTransform>

        </Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:PointViewModel}">
        <Ellipse Width="3" Height="3" Fill="Red"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style>
        <Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
        <Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</UserControl>

OriginalL'auteur Ian | 2010-02-10