加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – WPF Canvas Scaling / Transform to Fit

发布时间:2020-12-15 04:18:49 所属栏目:百科 来源:网络整理
导读:我正在转发这个问题,因为我上次没有得到太多的回应,希望有一点重写可能有助于… 本质上我要做的是创建一个数据绑定的画布,它将自动缩放其内容以“填充”可用空间.像一个缩放的分类适合操作.不幸的是,我的WPF技能还不是非常强大,而我正在努力研究如何做最后一
我正在转发这个问题,因为我上次没有得到太多的回应,希望有一点重写可能有助于…

本质上我要做的是创建一个数据绑定的画布,它将自动缩放其内容以“填充”可用空间.像一个缩放的分类适合操作.不幸的是,我的WPF技能还不是非常强大,而我正在努力研究如何做最后一部分.我已经遵循一些数据绑定的例子来获得画布的界限,但不知道是否可能是错误的,阻碍了我.

我现在有两个基本的问题,这取决于我尝试和解决方案的方式:

>我不知道怎么做
画布自动重新缩放
通过XAML如果可能使用a
转变.
>我似乎不能
在后面引用画布
代码,我猜是因为它的一部分
的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用作我的AutoResizingCanvas的DataContent,它具有以下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>

解决方法

由于您的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中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读