1

我想要得到的是对控件集合进行缩放但保留此控件子集的宽度、高度和位置的任何方式。我已经看到了如何在 WPF 放大和缩小时保持元素大小的问题?,似乎非常符合我的要求,但没有得到回答,也不是很明确,所以会改进这个问题。

目前我正在使用扩展为 .net 框架 4.0 的 WPF 工具包附带的 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.XCanvas.Y属性。所以我想要的是任何方式进行缩放(放大或缩小),并保持点(椭圆)或路径的大小......

由于缩放,是 wpf 的缩放转换,我想可能是在放大时执行此操作的一种方法,将缩小到要保持大小的控件,反之亦然。

特定行为的一个示例是混合设计器,例如,当您放大具有行和列的网格时,列指示器保持原始大小,类似的东西是我想要的点和路径。

我会欣赏任何解决方案,可能是库、附加属性、行为或代码。谢谢

4

2 回答 2

1

Blend 设计器使用 Adorners 作为其操纵器。大小是根据缩放当前缩放计算的。如果您对使用类似的技术感兴趣,那么自己进行计算实际上并不难。

您将创建一个设置为控件边界的装饰器,然后根据设计器中的缩放应用比例因子。因此,如果您缩放 2.0,那么您将 Scale 2.0 的 RenderTransform 应用到您的缩放控件,同时将您的装饰器计算为缩放控件的 ActualWidth 和 ActualHeight 的 2.0(因为这两个属性不考虑 RenderTransformations)。好消息是,由于一切都使用双精度数,因此在进行此类计算时,您可以获得像素完美的精度。

通过使用这种方法,您可以获得缩放主控件的能力,而您的操纵器只是缩放到缩放的控件,但始终保持其控件大小。

教程是一个很好的起点。在 OnRender 方法中,您要应用缩放因子(通过根据 UIElement 的 ActualWidth/Height 计算装饰器的边界,然后乘以缩放因子)。你如何应用你的装饰器很大程度上取决于应用程序的上下文——如果你正在做一个设计师,那么你会想要在设计画布中应用装饰器或根据项目选择来应用装饰器。

于 2013-03-11T20:38:25.017 回答
0

我进行了一项研究并发现了一些有用的东西,例如,如果您正在使用 Adorner,您可以覆盖GetDesiredTransform以设置您希望您的 adorner 执行的转换,在这里您可以将对您的 adorner 进行的转换设为 null . 有关更多详细信息,请参阅如何在 Adorner GetDesiredTransform 方法中从 GeneralTransform 中排除 scaleTransform。在女士。但我认为如果我想在控件上实现它,我需要自己控制变换。

于 2013-03-13T21:36:26.143 回答