Я перепроведении этот вопрос я не получил большую часть ответа в последний раз, надеюсь немного повторной редакции может помочь ...WPF Canvas Масштабирование/Transform Вписать
По сути то, что я пытаясь сделать это, создайте холст привязки данных, который автоматически масштабирует его содержимое, чтобы «заполнить» доступное пространство. Это похоже на масштабирование, подходящее для работы. К сожалению, мои навыки WPF еще не очень сильны, и я изо всех сил пытаюсь понять, как сделать эту последнюю часть. Я следил за некоторыми примерами привязки данных, чтобы получить привязку к холсту, но не уверен, может быть, это неправильно и мешает мне.
У меня есть две основные проблемы в данный момент в зависимости от того, как я стараюсь и решать решение, либо:
- я не знаю, как сделать холст Масштабирует автоматически через XAML, если это возможно с использованием преобразования .
- Я не могу показать ссылку на холст в коде , я предполагаю, что его часть элемента ItemsControl?
Пример того, что я пытаюсь добиться, я получил AI хочет, чтобы попытаться получить B:
(удалена просроченную ссылку на IMG)
Кода I «м в настоящее время с помощью довольно просто, создавая 4 точки с заданной координатой, а модель другого вида, чтобы обернуть их в.
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; } }
}
Тогда PointCollectionViewModel используется как Datacon палатка для моих AutoResizingCanvas, которая имеет следующий XAML для реализации связывания:
<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: Очень интересно, похоже, что это близко к тому, что я хочу. Если я изменю свой код, как вы предположили, я получаю InvalidOperationException «VisualTree of ItemsPanelTemplate должен содержать панель.« System.Windows.Controls.Viewbox »- это не панель.» – Ian
@Mart: Если я оберну свой AutoResizingCanvas UserControl в окне просмотра в соответствии с вашим другим предложением, мои очки будут масштабироваться, однако они появятся в странном месте, и я потеряю свой цвет фона. Смотрите скриншот: http://img62.imageshack.us/img62/4481/imagejc.jpg – Ian
Ваша проблема связана с тем, что Canvas не имеет измерения. Его родительский контейнер забирает все свободное пространство. Если вы знаете границы ваших точек «X» и «Y», установите их в «Ширина холста и высота». Таким образом, добавление Viewbox вокруг UserControl или ItemsControl фактически расширит его. – Mart