我想根据TextBox的内容显示和隐藏图像作为TextBox的背景。为此,我使用ImageBrush并使用值转换器绑定到TextBox的Text属性来调节不透明度:
<TextBox Height="23"
HorizontalAlignment="Left"
Margin="175,47,0,0"
VerticalAlignment="Top"
Width="120">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Style.Resources>
<!-- Converter -->
<local:EmptyStringToNotOpacityConverter x:Key="EmptyStringToNotOpacityConverter" />
</Style.Resources>
<Setter Property="Background">
<Setter.Value>
<ImageBrush ImageSource="search.png"
Stretch="None"
AlignmentX="Right"
AlignmentY="Center"
Opacity="{Binding RelativeSource={RelativeSource AncestorType=TextBox},
Path=Text,
Converter={StaticResource EmptyStringToNotOpacityConverter}, Mode=OneWay}"
/>
</Setter.Value>
</Setter>
</Style>
</TextBox.Style>
值转换器非常简单,将空字符串转换为1d,将其他任何内容转换为0d,如果TextBox为空则显示图像,如果TextBox不为空则隐藏图像。
一切都像预期的那样工作但我无法在启动期间摆脱绑定错误:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TextBox', AncestorLevel='1''. BindingExpression:Path=Text; DataItem=null; target element is 'ImageBrush' (HashCode=41973697); target property is 'Opacity' (type 'Double')
是否有人遇到过此行为并找到了解决方法以防止绑定错误?
答案 0 :(得分:1)
在与微软和一个支持案例进行协商后,发现这仍然是Visual Studio 2010中的一个未修复的Bug(Bug Dev10 | 817794),对可执行文件没有任何已知后果。
但是,由于我在VS2010中遇到了大量这些错误消息,因此输出窗口中会丢失重要的错误消息。因此,我试图找到一种解决方法,并使用VisualBrush而不是ImageBrush提出解决方案:
<Window x:Class="CSVisualBrush.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Visual Brush Opacity Binding" Height="350" Width="525">
<Grid>
<TextBox Name="txt"
Height="23"
HorizontalAlignment="Left"
Margin="175,47,0,0"
VerticalAlignment="Top"
Width="120">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background">
<Setter.Value>
<VisualBrush Stretch="None"
AlignmentX="Right"
AlignmentY="Center"
>
<VisualBrush.Visual>
<Image Name="img" Source="/CSVisualBrush;component/search.png" />
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</Style>
</TextBox.Style>
</TextBox>
</Grid>
</Window>
由于Binding在XAML中定义时不起作用,我在后面的代码中创建它:
public MainWindow() {
InitializeComponent();
// Set binding to opacity of the image
// REMARK: Binding doesn't work within XAML
Image img = (Image)((VisualBrush)txt.Background).Visual;
Binding b = new Binding();
b.Source = txt;
b.Path = new PropertyPath("Text");
b.Converter = new EmptyStringToNotOpacityConverter();
img.SetBinding(Image.OpacityProperty, b);
}
据我所知,我不知道绑定在代码中工作的原因,但在XAML中却没有。 如果有人遇到同样的问题,我将解决方案VS2010解决方案放在我的网站www.logiclink.de上。