2010-02-10 17 views
14

jestem przeksięgowanie na to pytanie, ponieważ nie dostać wiele odpowiedzi ostatni raz, miejmy nadzieję trochę ponownego sformułowania może pomóc ...WPF Canvas Skalowanie/Transform Fit

Zasadniczo co mam próbowanie zrobić, to stworzyć płótno databound, które automatycznie skaluje jego zawartość, aby "wypełnić" dostępną przestrzeń. Coś w rodzaju zoomu, który pasuje do operacji. Niestety, moje umiejętności WPF nie są jeszcze bardzo silne i staram się wypracować, jak wykonać tę ostatnią część. Podążyłem za pewnymi przykładami związanymi z wiązaniem danych, aby związać płótno, ale nie jestem pewien, czy może to jest złe i przeszkadza mi.

Mam dwa podstawowe problemy w tej chwili w zależności od sposobu staram i uporania się z roztworu albo:

  • nie wiem jak zrobić płócienną ponownego waga automatycznie przez XAML, jeśli jest to możliwe przy użyciu transformaty .
  • Nie mogę wydawać się, że odwołuje się do płótna w kodzie za , Zgaduję, ponieważ jego część z ItemsControl?

Przykładem tego, co staram się osiągnąć, mam AI chce spróbować i B:

(usunięte wygasły link do img)

kod I „m jest obecnie za pomocą bardzo prostych, tylko tworzenie 4 kropki o danej współrzędnej oraz model inny widok aby otoczyć je się.

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

Następnie PointCollectionViewModel używany jako Datacon namiot dla moich AutoResizingCanvas, który ma następującą XAML wdrożyć wiązania:

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

Odpowiedz

17

jak wasz Canvas nie wydaje się być ustalone wysokość i szerokość, chciałbym umieścić go w 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> 

Ewentualnie umieść cały zestaw UserControl w urządzeniu ViewBox.

+3

@Mart: Bardzo interesujące, wygląda na to, że jest blisko tego, co chcę. Jeśli zmienię kod tak, jak zasugerowałeś, otrzymuję wyjątek InvalidOperationException "VisualTree elementu ItemsPanelTemplate musi zawierać panel." System.Windows.Controls.Viewbox "nie jest panelem." – Ian

+0

@Mart: Jeśli zawijam moje AutoResizingCanvas UserControl w okienku podglądu, jak na twoje inne sugestie, moje punkty skalują się, jednak pojawiają się w dziwnym miejscu i tracę kolor tła. Zobacz zrzut ekranu: http://img62.imageshack.us/img62/4481/imagejc.jpg – Ian

+2

Twój problem wynika z tego, że płótno nie ma żadnego wymiaru. Jego kontener macierzysty powoduje, że zajmuje całą dostępną przestrzeń. Jeśli znasz granice punktów X i Y, ustaw je na szerokość i wysokość płótna. W ten sposób umieszczenie Viewboksa wokół UserControl lub ItemsControl spowoduje jego rozciągnięcie. – Mart