我一直在努力解决这个问题。 :(
对于TextBox,我有一个Validation.ErrorTemplate设置,在文本框的右侧有一个图像,但它有一个验证错误。
这很棒!但我想做的一件事是调整大小或设置有错误的文本框的边距,使其适合文本框在表单上的空间。目前,图像流向文本框区域之外。
我真正想要的是带有错误的文本框占用与没有文本框相同的空间。
这是我的XAML风格:
<Style TargetType="{x:Type TextBox}">
<Style.Resources>
<my:TextBoxWidthTransformConverter x:Key="TextBoxWidthTransformConverter"/>
</Style.Resources>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Margin" Value="{Binding Converter={StaticResource TextBoxWidthTransformConverter}, RelativeSource={RelativeSource Self}}"/>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
</Trigger>
</Style.Triggers>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel
Margin="{TemplateBinding Margin}"
Orientation="Horizontal"
RenderOptions.BitmapScalingMode="NearestNeighbor"
>
<AdornedElementPlaceholder
Grid.Column="1"
Grid.Row="1"
Name="controlWithError"
/>
<Border Width="2"/>
<Image
ToolTip="{Binding ElementName=controlWithError, Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"
Source="imagepath"
/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
我正在使用转换器TextBoxWidthTransformConverter只是为了看看我是否能够发生一些事情,但在我刚刚在Value中使用“0,0,20,0”之前,无济于事。转换器不会触发,保证金不会改变。我用过Snoop来看看我是否能看到被触摸或改变的属性,但没有任何反应。
Margin是否是Validation.HasError属性无法更改的属性?
任何见解都会很棒!
谢谢!
答案 0 :(得分:1)
希望帮助任何可能遇到此问题的人。
我仍然不确定为什么Margin属性在Validation.HasError触发器期间没有改变,但我发现了一个肮脏的工作。
解决方法使用IValueConverter设置边距,用一些事件(TextChanged和Unloading来清除事件)劫持Width属性绑定。我保留原始保证金,在我的情况下,我只是担心右边距,使用TextBoxes Tag属性。
public class TextBoxMarginConverter : IValueConverter
{
private const double TEXTBOX_MARGIN_RIGHT = 25.0;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
{
return double.NaN;
}
TextBox textBox = value as TextBox;
if (textBox == null)
{
return double.NaN;
}
if (Validation.GetHasError(textBox))
{
this.SetTextBoxMargin(TEXTBOX_MARGIN_RIGHT, textBox);
}
return textBox.Width;
}
private void SetTextBoxMargin(double marginRight, TextBox textBox)
{
if (textBox.Tag == null)
{
textBox.TextChanged += new TextChangedEventHandler(this.TextBoxTextChanged);
textBox.Unloaded += new RoutedEventHandler(this.TextBoxUnloaded);
double right = textBox.Margin.Right + marginRight;
textBox.Tag = textBox.Margin.Right;
textBox.Margin = new Thickness(textBox.Margin.Left, textBox.Margin.Top, right, textBox.Margin.Bottom);
}
}
private void TextBoxUnloaded(object sender, RoutedEventArgs e)
{
TextBox textBox = sender as TextBox;
if (textBox == null)
{
return;
}
textBox.TextChanged -= new TextChangedEventHandler(this.TextBoxTextChanged);
textBox.Unloaded -= new RoutedEventHandler(this.TextBoxUnloaded);
}
private void TextBoxTextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = sender as TextBox;
if (textBox == null)
{
return;
}
if (Validation.GetHasError(textBox))
{
this.SetTextBoxMargin(TEXTBOX_MARGIN_RIGHT, textBox);
return;
}
if (textBox.Tag != null)
{
double tag;
double.TryParse(textBox.Tag.ToString(), out tag);
textBox.Tag = null;
textBox.Margin = new Thickness(textBox.Margin.Left, textBox.Margin.Top, tag, textBox.Margin.Bottom);
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
在Validation.ErrorTemplate中,将转换器应用于Validation.HasError触发器:
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="Width" Value="{Binding Converter={StaticResource TextBoxMarginConverter}, RelativeSource={RelativeSource Self}}"/>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
</Trigger>
</Style.Triggers>