当前位置:  开发笔记 > Android > 正文

如何在WPF中展开控件以在ErrorTemplate中为错误消息腾出空间?

如何解决《如何在WPF中展开控件以在ErrorTemplate中为错误消息腾出空间?》经验,为你挑选了1个好方法。

我有一个使用验证的WPF窗口.我创建了一个错误模板,在一个未通过验证的元素周围放置一个红色边框,并在下面显示错误消息.这工作正常,但错误消息在控件下面的任何控件上呈现,并带有错误.我能说的最好,发生这种情况是因为错误模板在Adorner Layer上呈现,而Adorner Layer位于其他所有层之上.我希望发生的是其他一切都向下移动以便为错误消息腾出空间.有没有办法做到这一点?网络上的所有示例似乎都使用工具提示,并使用一个简单的指标,如星号或感叹号,不占用太多空间.

这是模板:


    
        
            
        
        
    

以下是使用模板的控件(我输入了一些,所以忽略任何语法错误):


  
    
    
  
  
    
      
        
          
          
        
      
    
  
  
    
      
        
          
        
      
    
  

Charles.. 6

编辑:好吧,我不肯定这是最好的解决方案(我当然希望有人可以提供更好的解决方案),但这里有:

您可以添加一些TextBlock并将它们绑定到Validation.HasError和(Validation.Errors)[0] .ErrorContent,使用客户IValueConverter转换,而不是使用Validation.ErrorTeplate(它将显示AdornerLayer中的所有视觉效果). Validation.HasError bool到Visibility值.它看起来像下面这样:

Window1.cs:


    
        
            
            
            
            
        
        
            
            
            
            
        
        
        
        

        
        
        
    

Person.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace WpfApplicationTest
{
    public class Person : IDataErrorInfo
    {
        public string Name { get; set; }
        public int Age { get; set; }

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error
        {
            get { throw new NotImplementedException(); }
        }

        string IDataErrorInfo.this[string columnName]
        {
            get
            {
                switch (columnName)
                {
                    case ("Name"):
                        if (Regex.IsMatch(this.Name, "[^a-zA-Z ]"))
                        {
                            return "Name may contain only letters and spaces.";
                        }
                        else
                        {
                            return null;
                        }
                    default:
                        return null;
                }
            }
        }

        #endregion
    }
}

HasErrorToVisibilityConverter.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows;

namespace WpfApplicationTest
{
    [ValueConversion(typeof(bool), typeof(Visibility))]
    public class HasErrorToVisibilityConverter : IValueConverter
    {
        #region IValueConverter Members

        object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool hasError = (bool)value;
            return hasError ? Visibility.Visible : Visibility.Collapsed;
        }

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

        #endregion
    }
}

它没有扩展,只有你可以在所有控件中引用的单个ControlTemplate,但它是我找到的唯一解决方案.我感觉到你的痛苦 - 几乎每个关于WPF验证主题的例子都非常简单,而且几乎总是使用'​​!' 或者'*'在控件之前,工具提示绑定到(Validation.Errors)[0] .ErrorContent ...

祝你好运!如果我找到更好的解决方案,我会更新这个;)



1> Charles..:

编辑:好吧,我不肯定这是最好的解决方案(我当然希望有人可以提供更好的解决方案),但这里有:

您可以添加一些TextBlock并将它们绑定到Validation.HasError和(Validation.Errors)[0] .ErrorContent,使用客户IValueConverter转换,而不是使用Validation.ErrorTeplate(它将显示AdornerLayer中的所有视觉效果). Validation.HasError bool到Visibility值.它看起来像下面这样:

Window1.cs:


    
        
            
            
            
            
        
        
            
            
            
            
        
        
        
        

        
        
        
    

Person.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace WpfApplicationTest
{
    public class Person : IDataErrorInfo
    {
        public string Name { get; set; }
        public int Age { get; set; }

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error
        {
            get { throw new NotImplementedException(); }
        }

        string IDataErrorInfo.this[string columnName]
        {
            get
            {
                switch (columnName)
                {
                    case ("Name"):
                        if (Regex.IsMatch(this.Name, "[^a-zA-Z ]"))
                        {
                            return "Name may contain only letters and spaces.";
                        }
                        else
                        {
                            return null;
                        }
                    default:
                        return null;
                }
            }
        }

        #endregion
    }
}

HasErrorToVisibilityConverter.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Windows;

namespace WpfApplicationTest
{
    [ValueConversion(typeof(bool), typeof(Visibility))]
    public class HasErrorToVisibilityConverter : IValueConverter
    {
        #region IValueConverter Members

        object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool hasError = (bool)value;
            return hasError ? Visibility.Visible : Visibility.Collapsed;
        }

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

        #endregion
    }
}

它没有扩展,只有你可以在所有控件中引用的单个ControlTemplate,但它是我找到的唯一解决方案.我感觉到你的痛苦 - 几乎每个关于WPF验证主题的例子都非常简单,而且几乎总是使用'​​!' 或者'*'在控件之前,工具提示绑定到(Validation.Errors)[0] .ErrorContent ...

祝你好运!如果我找到更好的解决方案,我会更新这个;)

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有