wpf绑定最大宽度与其他元素成比例';s宽度

本文关键字:成比例 宽度 元素 其他 绑定 wpf | 更新日期: 2024-10-18 08:34:48

我有以下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属性绑定到边栏宽度的70%,但我似乎在xaml中找不到这样做的方法。有没有一种干净的方法来实现这一点?

wpf绑定最大宽度与其他元素成比例';s宽度

要扩展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工作,但可以试试这个,看看它是否适合你

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

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