【问题标题】:WPF Zoom but keeping some items width, height and positionWPF 缩放但保留一些项目的宽度、高度和位置
【发布时间】:2013-02-27 03:31:48
【问题描述】:

我想要得到的是对控件集合进行缩放但保留此控件子集的宽度、高度和位置的任何方法。我已经看到问题How to keep element size while WPF zoom in and out?,似乎非常符合我的要求,但没有得到回答,也不是很明确,所以会改进问题。

目前我正在使用为 .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 的缩放转换,我想可能是在放大时执行此操作的一种方法,将缩小到要保持大小的控件,反之亦然。

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

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

【问题讨论】:

    标签: wpf zooming


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你有什么参考可以在哪里看到一些代码,或者附近的代码。
    • 我添加了一个指向装饰器教程的链接,其中包含有关如何实现缩放的评论。
    • 谢谢,我去看看
    • 希望这对您有用,如果有效,请将我的回复标记为答案!干杯。
    • 别担心,我会接受你的问题 :) 只是我正在研究为我找到更好的解决方案。我不认为 Adorners 适用于这种情况,我认为 Adorners 用于在多个项目中使用相同的。但就我而言,我想要放大的是数据模板,而不是装饰器。但我认为这个分析器是个好主意,它可以帮助我找到解决方案;)
    【解决方案2】:

    我进行了一项研究并发现了一些有用的东西,例如,如果您正在使用 Adorners,您可以覆盖 GetDesiredTransform 以设置您希望您的 adorner 执行什么转换,在这里您可以设为 null对您的装饰品进行的改造。有关详细信息,请参阅 How to exclude scaleTransform from GeneralTransform in Adorner GetDesiredTransform method. 在 Msdn。但是我认为如果我想在控件上实现它,我需要自己控制变换。

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多