ImageBrush Opacity绑定到TextBox

时间:2012-03-25 22:35:48

标签: wpf

我想根据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')

是否有人遇到过此行为并找到了解决方法以防止绑定错误?

1 个答案:

答案 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上。