比如StackPanel中有一个Rectangle,我希望当Rectangle的Margin随StackPanel宽度的变化而变化,比如,StackPanel的Width是100时Rectangle的Margin为10,0,10,0,当Width为200时为20,0,20,0,以此类推。请问在xaml中怎么实现?不要通过后台用IValueConverter。

解决方案 »

  1.   

    做成用户控件,自定义属性,把rectangle的宽度,设置成和stackpanel关联不就行了么。
      

  2.   

    最方便的就是用IValueConverter,可惜楼主不愿意用。你要做类似的逻辑操作不可能没后台代码的。
      

  3.   

    用事件可以做
    StackPanel  应该有sizeChanged之类的事件
    如果初使化后是固定的 
    可以在load方法里写
      

  4.   

    WPF的关联性绑定只能绑定相同的类型,对于类型不一样的情况就必须要转换,你这里一边是int类型100,另一边是Margin(10,0,10,0),完全不同的两种类型要关联到一起,不用IValueConverter怎么可能实现啊?
      

  5.   


    这样很麻烦啊,现在是1:10的关系,如果待会要用到一个1:20的又要写一个Converter,那得写多少去啊。
      

  6.   


    那如果是同类型的呢?比如B的Width是A的两倍。
      

  7.   

    同类型,但是值有发生变化的,也要有转换,只有完全相同的值才可以直接设置绑定,对于默认有转换的可以不需要,比如字符串到日期类型的转换,使用默认格式就完成的,因此不需要自定义IValueConverter,再比如字符串“True”到Bollean类型的true的转换,也是系统直接支持的,因此也不需要自定义了。
      

  8.   

    补充:IValueConverter是允许附带参数的,因此你可以定义一个比较通用的转换类,然后通过设置参数的方式实现带转换的绑定,这样可以不用为每个绑定都定义转换类了。
      

  9.   

    可以带参数的啊。Xaml中类似这样:Width="{Binding ElementName=Ex1, Path=ActualWidth, Converter={StaticResource ItemsWidthCov},ConverterParameter='10'}接口实现这样:public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                double myWidth = (double)value - double.Parse(parameter as string);
                if (myWidth > 0) return myWidth;
                else return 0;
            }