我想要的是在控件集合上进行缩放的任何方法,但保留此控件子集的宽度,高度和位置。我已经看到问题How to keep element size while WPF zoom in and out?,看起来非常符合我的要求,但是没有得到回答,也没有明确表达,所以这样可以改善这个问题。
目前我正在使用为.net framework 4.0扩展的WPF Toolkit附带的Zoombox控件,但我可以更改它。我的结构如下:
<Border x:Name="drawRegionBorder" Grid.Column="1" Grid.Row="1" d:LayoutOverrides="Width, Height" BorderThickness="1" CornerRadius="4" BorderBrush="{StaticResource BorderBrush}" >
<xctk:Zoombox x:Name="zoomBox">
<Grid x:Name="drawRegion" Height="{Binding Height}" Width="{Binding Width}" HorizontalAlignment="Left" VerticalAlignment="Top" Background="{DynamicResource DrawBackgroundBrush}">
<Image Source="{Binding Image}" ... />
<ListBox x:Name="points" ItemsSource="{Binding Points}">
<ListBox.Template>
<ControlTemplate>
<Canvas IsItemsHost="True"/>
</ControlTemplate>
</ListBox.Template>
</ListBox>
<ListBox x:Name="paths" ItemsSource="{Binding SomePaths}">
<ListBox.Template>
<ControlTemplate>
<Canvas IsItemsHost="True"/>
</ControlTemplate>
</ListBox.Template>
</ListBox>
<!--... Others ...-->
</Grid>
</xctk:Zoombox>
</Border>
我在这里有几个列表框,在网格内,每个列表框的项目面板是一个画布,所以每个子(但图像)将位于画布内,每个孩子都将设置Canvas.X
和Canvas.Y
属性。所以我想要的是任何方式进行缩放(放大或缩小),并保持poitns(椭圆形)或路径的大小......
由于变焦,是一个wpf的比例变换,我想可能是一种方法,当放大时这样做,缩小到控件我想保持大小,反之亦然。
特定行为的一个示例是混合设计器,例如当您使用行和列放大网格时,列指示符保持原始大小,这是我想要的点和路径。
我将感谢任何解决方案,可能是库,附加属性,行为或代码。 Thaknks
答案 0 :(得分:1)
Blend设计师将Adorners用于其操纵器。根据缩放当前缩放计算尺寸。如果您对使用类似的技术感兴趣,那么自己进行计算实际上并不困难。
您可以创建一个设置为控件边界的装饰器,然后根据设计器中的缩放应用缩放系数。因此,如果缩放2.0,则将缩放2.0的RenderTransform应用于缩放控件,同时将您的装饰器计算为缩放控件的ActualWidth和ActualHeight的2.0(因为这两个属性不考虑RenderTransformations)。好消息是,由于所有内容都使用了双打,因此在进行此类计算时,您可以获得像素完美的精度。
通过使用这种方法,您可以放大主控制,同时您的操纵器可以缩放到缩放的控件,但始终保持控制尺寸。
This教程是一个很好的起点。在OnRender方法中,您需要应用缩放系数(通过根据UIElement的ActualWidth / Height计算装饰器的边界,然后乘以缩放系数)。如何应用您的装饰器很大程度上取决于应用程序环境 - 如果您正在设计一个设计师,那么您希望在设计画布或项目选择中应用装饰器。
答案 1 :(得分:0)
我做了一个研究并发现了一些有用的东西,如果你正在与adorners合作,你可以覆盖GetDesiredTransform
以设置你希望你的装饰者做什么变换,在这里你可以将null转换为您的装饰器。有关详细信息,请参阅 How to exclude scaleTransform from GeneralTransform in Adorner GetDesiredTransform method.在Msdn。但我认为,如果我想在控件上进行控制,我需要通过自己来控制变换。