.net 用FormatConvertedBitmap替换基于datacontext值的图像

.net 用FormatConvertedBitmap替换基于datacontext值的图像,.net,wpf,.net,Wpf,我对wpf非常陌生,问题如下 带有图像的按钮的行为应该与WinForms中的按钮类似——禁用时变灰(因此有些人建议为图像设置不透明度是不够的,因为它会留下颜色) 所以我找到了一段代码: <Image RenderOptions.BitmapScalingMode="NearestNeighbor" Height="20" Width="20" Opacity="{Binding SelectedItem, Converter={StaticR

我对wpf非常陌生,问题如下

带有图像的按钮的行为应该与WinForms中的按钮类似——禁用时变灰(因此有些人建议为图像设置不透明度是不够的,因为它会留下颜色)

所以我找到了一段代码:

<Image RenderOptions.BitmapScalingMode="NearestNeighbor" Height="20" Width="20" 
                       Opacity="{Binding SelectedItem, Converter={StaticResource selectedItemPresent}}">
                    <Image.Source>
                        <FormatConvertedBitmap DestinationFormat="Gray8">
                            <FormatConvertedBitmap.Source>
                                <BitmapImage UriSource="Images/edit_info.png" />
                            </FormatConvertedBitmap.Source>
                        </FormatConvertedBitmap>
                    </Image.Source>
                    <Image.OpacityMask>
                        <ImageBrush>
                            <ImageBrush.ImageSource>
                                <BitmapImage UriSource="Images/edit_info.png">
                            </ImageBrush.ImageSource>
                        </ImageBrush>
                    </Image.OpacityMask>
                </Image> 

这将生成一个灰色按钮,任务完成了一半。 (转换器仅根据数据绑定项值返回1或0.3。)

然而,我真正需要的是仅当所选项为空时将其灰显

所以,我有两个问题。 1.如何应用所有这些。。。基于数据上下文值的内容?可能需要创建另一个转换器。 那么我必须以编程的方式执行这个声明性xaml?或者我可以在xaml中定义一些规则,这样只有当规则触发时,该部分才有效

2.应该对几个按钮执行此操作-如何将此逻辑分解出来(我在相关项目中看到了一些style.xaml-它放在哪里)


谢谢考虑。

为什么不将按钮的
图像
和/或
不透明度
基于
数据触发器中启用的

<Style TargetType="{x:Type Button}">
    <Setter Property="Content" Value="{StaticResource DefaultImage}" />
    <Setter Property="Opacity" Value="1" />

    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Content" Value="{StaticResource DisabledImage}" />
            <Setter Property="Opacity" Value=".3" />
        </Trigger>
    </Style.Triggers>
</Style>


这样做的最大优点之一是您不会将UI与任何业务逻辑捆绑在一起。在WPF中,按钮经常绑定到命令,如果
命令.CanExecute
的计算结果为false,则按钮将自动禁用。你不必担心这种情况。

正如我所说,我对WPF非常陌生。那么,我如何通过那些需要它的按钮(不是所有按钮)引用这个样式呢?我看到按钮上有一个样式属性,但在样式标记中没有看到类似Name属性的内容。此外,一个按钮的图像是相同的,无论是启用还是禁用。只要把它涂成灰色就行了。但我明白你的意思-把它移到样式。触发器,对吗?但是,每个按钮都有自己的图像源,所以我如何在样式中替换它?@Nickolodeon您可以给您的样式设置一个键,例如
,然后将其应用于特定的按钮
实际上我有类似Hi的东西