WPF - 绑定(bind)和渲染转换

标签 wpf xaml binding actualwidth actualheight

我想将scaleTransform绑定(bind)到传递ActualWidthActualHeight的转换器。

这是我想做的:

<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/

相关文章:

c# - RelayCommand 未执行

.net - 如何在 WPF MVVM 中使用用户控件

c# - 如何从列表中填充数据网格?

variables - 如何在 Clojure 宏中绑定(bind)变量?

objective-c - 为 BOOL 属性绑定(bind)到 NSMatrix

wpf - 是否可以从 UserControl xaml 文件在应用程序中添加 wpf ResourceDictionary?

具有 Storyboard 动画的 WPF 用户控件不稳定/不稳定

c# - 为 ListViewItem 执行命令的附加行为

c# - CallContext - 值消失 - WPF

wpf - 鼠标悬停时更改 ListViewItem 背景颜色