Холст WPF Масштабировать/Преобразовывать для Установки

Я повторно отправляю этот вопрос, поскольку я не получил большую часть ответа в прошлый раз, когда надо надеяться, немного перефразирования могло бы помочь...

По существу то, что я пытаюсь сделать, должно создать связанный с данными холст, который будет автоматически масштабировать его содержание для 'заполнения' свободного места. Вид подобных масштабирование для установки операции. К сожалению, мои навыки WPF еще не очень сильны, и я изо всех сил пытаюсь разработать, как сделать эту последнюю часть. Я последовал некоторым примерам привязки данных для связывания холста, но не уверенный если, возможно, его несправедливость и препятствие мне.

У меня есть две основных проблемы в данный момент в зависимости от способа, которым я пытаюсь заняться решением, также:

  • Я не знаю, как заставить холст повторно масштабироваться автоматически через XAML если его возможное использование преобразования.
  • Я, может казаться, не ссылаюсь на холст в позади кода, я предполагаю потому что его часть ItemsControl?

Пример того, чего я пытаюсь достигнуть, у меня есть я, хотят попытаться получить B:

(удаленный истек ссылка на img),

Код, который я в настоящее время использую, довольно прост, просто создав 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 используется в качестве DataContent для моего 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
задан Ian 15 January 2014 в 12:50
поделиться

1 ответ

Поскольку ваш 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.

18
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: