2010-02-10 5 views
14

Я перепроведении этот вопрос я не получил большую часть ответа в последний раз, надеюсь немного повторной редакции может помочь ...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> 

ответ

17

Как ваш Canvas, кажется, не имеют фиксированную ширину и высоту, я бы включил его в 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> 

В качестве альтернативы, поместите все ваше UserControl в ViewBox.

+3

@Mart: Очень интересно, похоже, что это близко к тому, что я хочу. Если я изменю свой код, как вы предположили, я получаю InvalidOperationException «VisualTree of ItemsPanelTemplate должен содержать панель.« System.Windows.Controls.Viewbox »- это не панель.» – Ian

+0

@Mart: Если я оберну свой AutoResizingCanvas UserControl в окне просмотра в соответствии с вашим другим предложением, мои очки будут масштабироваться, однако они появятся в странном месте, и я потеряю свой цвет фона. Смотрите скриншот: http://img62.imageshack.us/img62/4481/imagejc.jpg – Ian

+2

Ваша проблема связана с тем, что Canvas не имеет измерения. Его родительский контейнер забирает все свободное пространство. Если вы знаете границы ваших точек «X» и «Y», установите их в «Ширина холста и высота». Таким образом, добавление Viewbox вокруг UserControl или ItemsControl фактически расширит его. – Mart