WPF lona Escala / Transform para ajustar
-
19-09-2019 - |
Pergunta
Estou reposting esta pergunta como eu não ficar muito de uma resposta última vez, espero um pouco de re-formulação poderia ajudar ...
Essencialmente o que estou tentando fazer é criar uma tela de ligação de dados, que irá dimensionar automaticamente o seu conteúdo para 'encher' o espaço disponível. Como uma espécie de zoom para o funcionamento adequado. Infelizmente minhas habilidades WPF ainda não são muito fortes, e eu estou lutando para descobrir como fazer isso última parte. Eu segui alguns exemplos de ligação de dados para se a tela ligado, mas não tenho certeza se talvez sua errado e me impedindo.
Eu tenho dois problemas básicos no momento, dependendo da forma como eu tentar resolver a solução, ou:
- eu não sei como fazer o lona re-escala automaticamente através de XAML se é possível utilizar um transformar.
- Eu não consigo referência a tela na trás código, eu estou supondo, porque a sua parte de um ItemsControl?
Um exemplo do que estou tentando alcançar, eu tenho um que eu quero tentar e obter B:
( removido link expirado a um img )
O código que estou usando atualmente é bastante simples, basta criar 4 pontos com uma determinada coordenada, e um modelo de outro ponto de vista a envolver estes em.
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; } }
}
Em seguida, a PointCollectionViewModel é usado como o DataContent para os meus AutoResizingCanvas, que tem a seguinte XAML para implementar a ligação:
<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>
Solução
Tal como o seu Canvas
não parecem ter largura fixa e altura, eu iria incluí-lo em um 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>
Como alternativa, coloque todo o seu UserControl
em um ViewBox
.