WPF图像控件:一旦代码中的源被修改,触发器就会停止工作

4

我在更改WPF图像控件的“源”属性时遇到了一些问题。

我定义了三个图像源:

<Window.Resources>
    <BitmapImage x:Key="eyeSelImage" UriSource="/Images/eye-Sel.png" />
    <BitmapImage x:Key="eyeSelHlImage" UriSource="/Images/eye-SelHl.png" />
    <BitmapImage x:Key="eyeDisabled" UriSource="/Images/eye-Disabled.png" />
</Window.Resources>

我的图像定义看起来像这样:

<Image x:Name="testImage" Width="100" Height="100">
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Setter Property="Source" Value="{StaticResource eyeSelImage}"/>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Source" Value="{StaticResource eyeDisabled}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

它的工作效果符合预期。如果图像控件被禁用,图像将更改。一旦启用,它会改回来。我通过制作一个按钮(btn_DisableEnable)进行测试,当单击该按钮时,切换“testImage”的“IsEnabled”属性。

然而,一旦我在代码中更改了“testImage”图像控件的“Source”,“IsEnabled”触发器似乎停止工作。我制作了另一个按钮,在其“Click”事件处理程序中执行以下操作:

BitmapImage tempImage = new BitmapImage();
tempImage.BeginInit();
tempImage.UriSource = new Uri("pack://application:,,,/testApp1;component/Images/eye-SelHl.png");
tempImage.EndInit();
testImage.Source = tempImage;

在按下此按钮后,图像的源正确更改为“eyeSelHlImage”资源。但是当单击“btn_DisableEnable”时,图像不再更改为其禁用表示形式和返回。
可能的问题是什么?非常感谢所有的帮助。
谢谢!
1个回答

5
由于依赖属性可以通过不同的机制进行设置(触发器、样式、主题、继承等),因此定义了“设置”优先级列表。
您可以在此处找到它。
正如您所看到的,本地值 - 即如果您使用代码或XAML直接设置属性,或使用SetValue方法设置属性,则具有比样式或触发器更高的优先级。
因此,通过代码设置Source属性优先于触发器设置的任何值。
这就是为什么在调用代码后,您的触发器不再起作用的原因。

我之前见过这种类似的解释,但由于你发的链接在我看到的每篇帖子中都无法打开,所以我无法了解详细信息(如果我点击链接,会显示“此主题不再可用”)。然而,你添加了一条评论,在其他我查看过的任何帖子中都没有看到。那就是代码中的设置也是“本地值”。谢谢。 现在我的唯一选择是实现一个“IsEnabledChanged”事件,并在那里操纵图像吗? - EEALNT
是的,@EEALNT,你可以。无论如何,你也可以考虑使用绑定(我建议这种方式)。 - Il Vic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接