2013-03-11 77 views
0

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

目前,我正在使用为WPF工具包附带的.net framework 4.0扩展控件,但我可以更改它。我有结构如下:

<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属性。所以,我想要的,是任何使缩放(放大或缩小),并保持poitns(椭圆)或路径的大小...

由于缩放,是一个wpf的比例转换,我想可能是这样做的一种方式,当放大,缩小控制我想保持大小,反之亦然。

混合设计器的一个示例是混合设计器,例如当您使用行和列放大网格时,列指示器保持原始尺寸,这样的事情就是我想要的点和路径。

我会感谢任何解决方案,可能是图书馆,附属财产,行为或代码。 Thaknks

回答

1

混合设计师使用Adorners作为其操纵器。尺寸根据缩放当前缩放进行计算。如果您有兴趣使用类似的技术,那么亲自进行计算其实并不难。

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

通过使用此方法,您可以缩放主控件,而操纵器只是缩放到缩放控件,但始终保持其控件大小。

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

+0

你有什么参考我在哪里可以看到一些代码或接近代码。 – 2013-03-11 22:00:56

+0

我已经添加了关于装饰教程的链接,并提供了关于如何实现缩放的评论。 – cunningdave 2013-03-11 22:13:07

+0

谢谢,我会看看 – 2013-03-11 23:35:17

0

我已经做了一项研究,发现了一些有用的东西,例如,如果您正在与装饰者合作,您可以覆盖GetDesiredTransform以设置您希望装饰者做什么变形,在这里您可以使null转变成你的装饰者。欲了解更多详情,请参阅 How to exclude scaleTransform from GeneralTransform in Adorner GetDesiredTransform method.在Msdn。但我认为,如果我想让它在控制上,我需要通过我自己来控制转换。

相关问题