我对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 - 是放在哪里)?
感谢您的考虑。
答案 0 :(得分:0)
为什么不将Button的Image
和/或Opacity
基于IsEnabled
的{{1}}值?
DataTrigger
以这种方式实现这一目标的最大优势之一是您不会将UI与任何业务逻辑联系在一起。在WPF中,按钮经常绑定到命令,如果<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>
计算结果为false,则会自动禁用。你不必担心这种情况。