wpf绑定最大宽度与其他元素的宽度成正比

时间:2015-03-05 01:09:18

标签: c# wpf xaml

我有以下ItemTemplate:

<ListView.ItemTemplate>
    <DataTemplate>                           
        <Border CornerRadius="5" Background="{Binding SenderId, Converter={StaticResource ColorConverter}}"
                MaxWidth="{Binding ActualWidth, ElementName=SideBar}"
                HorizontalAlignment="{Binding SenderId, Converter={StaticResource AlignmentConverter}}">

            <TextBlock Text="{Binding Message}" TextWrapping="Wrap" />
        </Border>
    </DataTemplate>
</ListView.ItemTemplate>

我想要做的是将Border元素MaxWidth属性绑定到SideBar宽度的70%,但我似乎找不到在xaml中执行此操作的方法。 有没有一种干净的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

扩展Rohit Vats评论:

将此课程添加到您的解决方案中:

public class ElementSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double percentage = double.Parse(parameter.ToString());

        return double.Parse(value.ToString()) * percentage;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

然后,在您的XAML中,声明该类在文档头中的位置的名称空间:

xmlns:ConverterNamespace="clr-namespace:ConverterNamespace"

在资源中实例化转换器:

<Window.Resources>
    <ConverterNamespace:ElementSizeConverter x:Key="ElementSizeConverter"/>
</Window.Resources>

然后你可以使用以下绑定:

Width="{Binding Width, ElementName=elementName, Converter={StaticResource ElementSizeConverter}, ConverterParameter=0.7}"

注意:我无法使ActualWidth正常工作,但请使用此功能,看看这是否适合您。

答案 1 :(得分:1)

通过嵌套在网格中,您还可以获得百分比:

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="15*" />
                <ColumnDefinition Width="70*" />
                <ColumnDefinition Width="15*" />                            
            </Grid.ColumnDefinitions>           
            <Border Grid.Column="1"
                    CornerRadius="5" 
                    Background="{Binding SenderId, Converter={StaticResource ColorConverter}}"
                    HorizontalAlignment="{Binding SenderId, Converter={StaticResource AlignmentConverter}}">
                <TextBlock Text="{Binding Message}" TextWrapping="Wrap" />
            </Border>
         </Grid>
    </DataTemplate>
</ListView.ItemTemplate>