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