首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF绑定和RenderTransform

WPF绑定和RenderTransform
EN

Stack Overflow用户
提问于 2009-06-27 18:06:34
回答 3查看 6.9K关注 0票数 3

我想通过ActualWidthActualHeight将scaleTransform绑定到转换器。

下面是我想要做的:

代码语言:javascript
复制
<Canvas x:Name="Canevas">
   <Canvas.RenderTransform>
      <TransformGroup>
         <ScaleTransform 
              ScaleX="{Binding RelativeSource={RelativeSource FindAncestor, 
                               AncestorType={x:Type UIElement}}, 
                               Path=ActualWidth, Mode=OneWay, 
                               Converter={StaticResource ScaleConverter}, 
                               ConverterParameter={Binding Path=ActualWidth}"

              ScaleY="{Binding RelativeSource={RelativeSource FindAncestor,
                               AncestorType={x:Type UIElement}}, 
                               Path=ActualHeight, Mode=OneWay, 
                               Converter={StaticResource ScaleConverter},  
                               ConverterParameter={Binding Path=ActualHeight}}"
         />
      </TransformGroup>
   </Canvas.RenderTransform>

   <Ellipse Canvas.Left="47" Canvas.Top="48" Height="155" 
            Name="ellipse1" Stroke="Black" Width="174" Fill="#FF00C6C3" />

问题是这不能编译:

代码语言:javascript
复制
ConverterParameter={Binding Path=ActualHeight}

所以我想知道如何将这些属性作为我的转换器的参数?是否有可能解析完整的Xaml?

非常感谢您的帮助!

转换器源代码:

代码语言:javascript
复制
public class ScaleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                                        System.Globalization.CultureInfo culture)
    {
        double v = (double)value;
        var actualSize = (double)parameter; //ActualWidth, ActualHeight

        var vScale = v * (1 + (v / actualSize));

        return vScale;
    }

    public object ConvertBack(object value, Type targetType, object parameter, 
                                        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
EN

回答 3

Stack Overflow用户

发布于 2009-06-27 21:04:59

我认为您可能会想出一种方法来实现这一点,方法是让ScaleConverter从DependencyObject继承下来,给它一个ActualSize依赖属性,将它的两个实例放在您的资源中,而不是一个,并执行一个到源的单向绑定,将一个实例的ActualSize绑定到画布的ActualWidth,将另一个绑定到它的ActualHeight (这样,当画布调整大小时,实例的ActualSize总是与画布的宽度/高度保持同步)。

然而, it看起来像是你实际上想要简单的东西:拉伸画布以填充其父画布。如果是这样的话,看看Viewbox

代码语言:javascript
复制
<Viewbox Stretch="Fill">
    <Canvas Width="221" Height="203">
        <Ellipse Canvas.Left="47" Canvas.Top="48" Height="155"
                 Stroke="Black" Width="174" Fill="#FF00C6C3" />
    </Canvas>
</Viewbox>

我加入了Stretch="Fill"来拉伸X和Y,而不保留纵横比,因为这看起来就像你想要的。您还需要为画布分配宽度和高度才能使其正常工作,因为默认情况下画布没有自然大小。上面的代码片段设置了一个宽度和高度,使您的椭圆位于拉伸的Viewbox的右下角;您可能需要不同的东西。

Viewbox的一个可能的缺点是描边粗细也会缩放,因此如果将窗口设置得又短又宽,则水平描边会变细,而垂直描边会变粗。如果这是一个问题,您可能需要坚持使用数据绑定。

票数 4
EN

Stack Overflow用户

发布于 2013-03-22 00:05:41

EDIT:我的答案就是重构你的代码,让它可以编译。如果您的解决方案不起作用,那么这个也不会起作用。

使用IMultiValueConverterMultiBinding,而不是使用IValueConverter。不是将额外的值作为ConverterParameter传递,而是将其作为额外的绑定传递。

代码语言:javascript
复制
    <Canvas x:Name="Canvas">
        <Canvas.RenderTransform>
            <TransformGroup>
                <!--<ScaleTransform ScaleX="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UIElement}}, Path=ActualWidth, Mode=OneWay, Converter={StaticResource ScaleConverter}, ConverterParameter={Binding Path=ActualWidth}"
                           ScaleY="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UIElement}}, Path=ActualHeight, Mode=OneWay, Converter={StaticResource ScaleConverter}, ConverterParameter={Binding Path=ActualHeight}}" />-->
                <ScaleTransform>
                    <ScaleTransform.ScaleX>
                        <MultiBinding Converter="{StaticResource ScaleConverter}">
                            <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualWidth" Mode="OneWay"/>
                            <Binding Path="ActualWidth"/>
                        </MultiBinding>
                    </ScaleTransform.ScaleX>
                    <ScaleTransform.ScaleY>
                        <MultiBinding Converter="{StaticResource ScaleConverter}">
                            <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type UIElement}}" Path="ActualHeight" Mode="OneWay"/>
                            <Binding Path="ActualHeight"/>
                        </MultiBinding>
                    </ScaleTransform.ScaleY>
                </ScaleTransform>
            </TransformGroup>
        </Canvas.RenderTransform>
        <Ellipse Canvas.Left="47" Canvas.Top="48" Height="155" Name="ellipse1" Stroke="Black" Width="174" Fill="#FF00C6C3" />
    </Canvas>

和您的转换器:

代码语言:javascript
复制
public class ScaleConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double v = (double)values[0];
        var actualSize = (double)values[1]; //ActualWidth, ActualHeight

        var vScale = v * (1 + (v / actualSize));

        return vScale;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2009-06-27 18:31:03

不幸的是,我不认为这是可能的。因为Binding.ConverterParameter不是DependencyProperty,所以不能使用绑定来填充它的值。我以前也尝试过这样做(使用ConverterParameter的绑定),遇到了和您一样的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1053346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档