【问题标题】:WPF Scaling IssueWPF 缩放问题
【发布时间】:2010-08-19 17:31:29
【问题描述】:

我对使用 ScaleTransform 遇到的问题感到困惑。我有一个固定宽度和高度的网格。网格包含一个孩子,一个矩形。 Rectangle 的 Fill 是一个 VisualBrush,其 Visual 绑定到网格外部的画布,其尺寸相当大。在矩形上,我使用 ScaleTransform,ScaleX 和 ScaleY 都设置为 0.18。本质上,我试图缩小矩形的视觉效果以适应我的网格。似乎正在发生的事情是网格本身正在按比例缩小,导致结果比我想要的要小得多。我已经包含了下面的代码。作为参考,矩形绑定的高度和宽度基本上分别为 900 x 600。任何关于我可能做错了什么的指针将不胜感激。

<Grid Height="225" Width="200" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="PART_Content">
            <Rectangle Height="{Binding Path=ActualHeight}" Width="{Binding Path=ActualWidth}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <Rectangle.Fill>
                    <VisualBrush Visual="{Binding}"/>
                </Rectangle.Fill>
                <Rectangle.RenderTransform>
                    <ScaleTransform ScaleX="0.183" ScaleY="0.183"/>
                </Rectangle.RenderTransform>
            </Rectangle>
        </Grid>

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    您可以发布 Canvas 元素的 XAML 吗?我尝试了以下,我得到了你想要的行为(矩形被缩放并且网格的大小正确)

    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
    
            <Grid ShowGridLines="True"  Height="225" Width="200" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="PART_Content">
                <Rectangle Height="{Binding Path=ActualHeight}" Width="{Binding Path=ActualWidth}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <Rectangle.Fill>
                        <VisualBrush Visual="{Binding ElementName=theCanvas}"/>
                    </Rectangle.Fill>
                    <Rectangle.RenderTransform>
                        <ScaleTransform ScaleX="0.183" ScaleY="0.183"/>
                    </Rectangle.RenderTransform>
                </Rectangle>
            </Grid>
    
            <Canvas x:Name="theCanvas" Grid.Row="1">
                <Rectangle Fill="Brown" Height="300" Width="300" />
    
            </Canvas>
        </Grid>
    

    【讨论】:

      【解决方案2】:

      什么是实际宽度和实际高度?除非我弄错了 ActualHeight 和 ActualWidth 属性,因为它们通常在 WPF 中表示 不是 DP,您不能绑定到它们。正如下面所指出的,这些是只读的依赖属性。假设这是在 CustomControl 样式中,首先应将 Binding 更改为 TemplateBinding。

      我删除了绑定,基本上创建了一个静态版本的 XAML,看起来还不错。由于您为网格定义了 Part_Content,我很好奇,这个 xaml 是自定义控件样式的一部分吗? CustomControl 的代码是否通过 PART_Content 操作网格?

      <Grid Height="225" Width="200" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="PART_Content" Background="Red">
      <Rectangle  Height="225" 
                  Width="200" 
                  HorizontalAlignment="Stretch" 
                  VerticalAlignment="Stretch"
                  Fill="Blue">
      
                  <Rectangle.RenderTransform>
                      <ScaleTransform ScaleX="0.183" ScaleY="0.183"/>
                  </Rectangle.RenderTransform>
              </Rectangle>
          </Grid>
      

      【讨论】:

      • ActualHeight 和 ActualWidth 是只读的 DependencyProperties。没有理由不能像 Chris 那样将它们用作绑定源 - 源可以是任何 CLR 属性。只有目标需要成为 DP。在这种情况下,您不能为它们中的任何一个赋值,因为它们是只读的,因此不能用作目标。
      • “源可以是任何 CLR 属性”要使绑定有意义,它需要由 INotifyPropertyChanged 支持。也就是说,我确实说过我可能会误认为这些不是 DP。坦率地说,我发现这段代码非常奇怪。如果他确实想绑定到 ActualHeight 和 ActualWidth,他应该使用 TemplateBinding 而不是 Binding。当您想绑定到数据上下文中的某些内容时,您使用绑定,我很确定他的 VM 中没有 ActualHeight/Width。
      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2011-02-16
      • 2017-02-08
      • 2019-05-24
      相关资源
      最近更新 更多