Domanda

Sono reinserire questa domanda in quanto non ho avuto molto più di una risposta ultima volta, si spera un po 'di ri-formulazione potrebbe aiutare ...

In sostanza quello che sto cercando di fare è di creare una tela databound, che scalerà automaticamente il contenuto di 'riempire' lo spazio a disposizione. Un po 'come uno zoom per adattare il funzionamento. Purtroppo le mie capacità WPF non sono ancora molto forte, e sto lottando per capire come fare questa ultima parte. Ho seguito alcuni esempi di associazione dati per ottenere la tela vincolata, ma non è sicuro se forse è sbagliato e mi sfavorevole.

Ho due problemi fondamentali al momento a seconda del modo in cui cerco di affrontare la soluzione sia:

  • non so come fare il tela re-scala automaticamente attraverso XAML se possibile utilizzando un trasformare.
  • Non riesco a riferimento tela nel dietro codice, sto cercando di indovinare perché la sua parte di un ItemsControl?

Un esempio di quello che sto cercando di realizzare, ho un io voglio cercare di ottenere B:

( rimosso collegamento scaduto a un img )

Il codice Attualmente sto usando è piuttosto semplice, solo la creazione di 4 punti con una data di coordinate, e un modello un'altra vista per avvolgere questi in.

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; } }
}

Poi il PointCollectionViewModel viene utilizzato come DataContent per i miei AutoResizingCanvas, che ha il seguente codice XAML per implementare la rilegatura:

<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>
È stato utile?

Soluzione

Come il tuo Canvas non sembra avere larghezza e altezza fissa, vorrei includere in una Viewbox:

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Viewbox Stretch="Uniform">
            <Canvas x:Name="canvas" Background="DarkSeaGreen">
                <Canvas.LayoutTransform>
                <ScaleTransform ScaleY="-1" />
                </Canvas.LayoutTransform>
            </Canvas>
        </Viewbox>
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

In alternativa, inserire il vostro intero UserControl in un ViewBox.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top