在XAML中将属性设置为函数

时间:2012-03-28 12:05:29

标签: wpf wpf-controls

我需要设置cotrol的属性,该属性是其父级的另一个属性的依赖。 我试着通过一个例子更好地解释我的问题。我想创建一个切换开关按钮,动画一个"滑块"元素进入它。当用户控件插入应用程序窗口时,将定义切换开关的尺寸。我希望滑块的尺寸比开关盒大一半。因此,如果控件大100,滑块应该是50,或者如果大250,滑块应该是125.然后我需要调用函数或类似的东西:

<UserControl>
 <Border Name="switchCase" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Border Name="slider" Width="**Container.Width/2**" ></Border>
 </Border>
</UserControl>

有没有可能实现这个目标? 提前致谢 保罗

2 个答案:

答案 0 :(得分:3)

开箱即用,XAML不支持。您只能bind to Properties

  • 您可以编写一个进行计算的转换器(或者您可以使用 MathConverter
  • 您可以在事件后面的代码中进行计算 处理程序
  • 如果您遵循MVVM模式,则可以执行此操作 ViewModel中的计算(尽管它将引入视图 与ViewModels相关的概念并不总是好的......)
  • 您可以编写自己的Binding扩展名

答案 1 :(得分:3)

是的,您需要使用转换器进行数据绑定,例如以下示例

 xmlns:conv="clr-namespace:MyConverters.Converters"
 .......
    <UserControl.Resources>
        <conv:WidthConvertercs x:Key="widthConv"></conv:WidthConvertercs>
    </UserControl.Resources>
    <Border Name="switchCase" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
        <Border Name="slider" Width="{Binding ElementName=switchCase, Path=ActualWidth, Converter={StaticResource widthConv}}" Background="DarkMagenta"></Border>
    </Border>

您的转换器类将是

[ValueConversion(typeof(double), typeof(double))]
    class WidthConvertercs : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            double withPar = (double)value;
            return withPar/2.0;
        }

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

我希望这会有所帮助