我想将scaleTransform绑定(bind)到传递ActualWidth
或ActualHeight
的转换器。
这是我想做的:
<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();
}
}
最佳答案
我认为您可能会找到一种方法来完成这项工作,方法是使 ScaleConverter 继承自 DependencyObject
,为其提供 ActualSize 依赖属性,将其两个实例而不是一个实例放入您的资源中,并进行单向源绑定(bind),将一个实例的 ActualSize 绑定(bind)到 Canvas 的 ActualWidth
,将另一个实例的 ActualSize 绑定(bind)到其 ActualHeight
(因此实例的 ActualSize 始终保持同步)随着 Canvas 大小的调整 Canvas 的宽度/高度)。
但是,看起来您可能实际上想要一些简单的东西:拉伸(stretch) Canvas 以填充其父级。如果是这种情况,请查看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"
来拉伸(stretch) X 和 Y 而不保留纵横比,因为这看起来就像您想要的那样。您还需要为 Canvas 分配宽度和高度才能使其正常工作,因为默认情况下 Canvas 没有自然尺寸。上面的代码片段设置了一个宽度和高度,将椭圆形放置在拉伸(stretch) View 框的右下角;您可能想要与此不同的东西。
Viewbox 的一个可能的缺点是笔划粗细也会缩放,因此如果您将窗口设置得又短又宽,则水平笔划会很细,垂直笔划会很粗。如果这是一个问题,您可能需要坚持使用数据绑定(bind)。
关于WPF - 绑定(bind)和渲染转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053346/