【问题标题】:WPF Set the Corner Radius of a Border through a ConverterWPF通过转换器设置边框的角半径
【发布时间】:2013-04-29 11:57:05
【问题描述】:

我想为列表中的“最后一个”项目设置 ListView 项目的底角半径。我尝试使用转换器(实际上找到最后一行)这样做,但无济于事。

理想的效果是当Converter在找到ListView的最后一项后返回true时,最后一个ListViewItem上的边框CornerRadius设置为CornerRadius="0,0,10,10"。对于 ListView 中的所有其他项目,CornerRadius="0,0,0,0"

到目前为止我做了什么。

转换器...

public class IsLastItemConverter : IValueConverter
   {
       #region IValueConverter Members
       public object TrueValue { get; set; }
       public object FalseValue { get; set; }

       public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
       {
        ListViewItem item = value as ListViewItem;
        ListView listView = ItemsControl.ItemsControlFromItemContainer(item) as ListView;
        if (listView != null)
        {

            int index = listView.ItemContainerGenerator.IndexFromContainer(item);
            if (index == listView.Items.Count - 1)
            {
                TrueValue = true;
                return (bool)TrueValue;
            }
            else
            {
                FalseValue = false;
                return (bool)FalseValue;
            }

        }
            FalseValue = false;
            return (bool)FalseValue;
       }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
       {
        // Just Convert Back
        return true;
       }
       #endregion
   }

XAML...

<local:IsLastItemConverter x:Key="lastItemConverter" 
                                   TrueValue="0,0,10,10" FalseValue="0,0,0,0"/>


<DataTemplate x:Key="CellContentTemplate">
                        <Border 
                            x:Name="CellContentBorder"
                            Background="{StaticResource GrayCharcoal}"                          
                            BorderThickness="4,4,4,4"                           
                            BorderBrush="{StaticResource Gray}"
                            CornerRadius="{Binding Converter={StaticResource lastItemConverter}, 
                            RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}}"
                            HorizontalAlignment="Left" 
                            Width="210" 
                            Height="50"                         
                            ContextMenu="{StaticResource MarginalUnitsContextMenu}" 
                            ScrollViewer.VerticalScrollBarVisibility="Hidden">...

非常感谢您的想法和想法 - 格伦

【问题讨论】:

    标签: xaml listview border converter


    【解决方案1】:

    我会尝试返回一个真正的 CornerRadius 而不是一个字符串(你实际上是在返回)。

    我的假设如下: 当在 xaml 中作为字符串“0,0,0,0”作为 CornerRadius 传递时,使用适当的转换器将此字符串转换为 CornerRadius 结构。

    由于您现在使用的是自定义转换器,可能不再使用 CornerRadius Converter 的字符串...

    编辑(根据 Clemens 的回答):当从与绑定关联的自定义转换器返回字符串时,该属性的转换器似乎启动了! 这是因为 CornerRadius 有一个关联的 TypeConverter:

    [TypeConverterAttribute(typeof(CornerRadiusConverter))]
    public struct CornerRadius : IEquatable<CornerRadius>
    

    处理此转换。该转换器处理从字符串到 CornerRadius 的转换。 (取自http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverterattribute.aspx

    【讨论】:

    • 丹尼尔 - 非常感谢您的建议。以所需格式返回字符串确实起到了作用。我对这个论坛上的提交有点陌生,所以让我知道我是否/如何给你信用。格伦
    • 为了大家的利益,最终的结果是通过修改Converter内部的return来完成的。如果为真,则返回“0,0,10,10”; - 格伦
    • 嗨格伦,很高兴它成功了。如果答案是正确的答案,那么你可以接受它,如果你喜欢它,你可以投票。
    • @Daniel 仅供参考,问题在于 OP 从其转换器返回了 bool,而不是字符串。
    • @Daniel 转换器不是“可链接的”。实际上有两种转换器。从字符串到 CornerRadius 的默认转换由 TypeConverter 完成,而绑定使用 IValueConverter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多