我想通过ActualWidth或ActualHeight将scaleTransform绑定到转换器。
下面是我想要做的:
<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" />
问题是这不能编译:
ConverterParameter={Binding Path=ActualHeight}所以我想知道如何将这些属性作为我的转换器的参数?是否有可能解析完整的Xaml?
非常感谢您的帮助!
转换器源代码:
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();
}
}发布于 2009-06-27 21:04:59
我认为您可能会想出一种方法来实现这一点,方法是让ScaleConverter从DependencyObject继承下来,给它一个ActualSize依赖属性,将它的两个实例放在您的资源中,而不是一个,并执行一个到源的单向绑定,将一个实例的ActualSize绑定到画布的ActualWidth,将另一个绑定到它的ActualHeight (这样,当画布调整大小时,实例的ActualSize总是与画布的宽度/高度保持同步)。
然而, it看起来像是你实际上想要简单的东西:拉伸画布以填充其父画布。如果是这样的话,看看Viewbox
<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的一个可能的缺点是描边粗细也会缩放,因此如果将窗口设置得又短又宽,则水平描边会变细,而垂直描边会变粗。如果这是一个问题,您可能需要坚持使用数据绑定。
发布于 2013-03-22 00:05:41
EDIT:我的答案就是重构你的代码,让它可以编译。如果您的解决方案不起作用,那么这个也不会起作用。
使用IMultiValueConverter和MultiBinding,而不是使用IValueConverter。不是将额外的值作为ConverterParameter传递,而是将其作为额外的绑定传递。
<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>和您的转换器:
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();
}
}发布于 2009-06-27 18:31:03
不幸的是,我不认为这是可能的。因为Binding.ConverterParameter不是DependencyProperty,所以不能使用绑定来填充它的值。我以前也尝试过这样做(使用ConverterParameter的绑定),遇到了和您一样的问题。
https://stackoverflow.com/questions/1053346
复制相似问题