我有带按钮的wpf应用程序,它应该反映两种状态 - 启用/禁用。 该按钮的图像为内容:
<Button Name="FindButton" Style="{StaticResource TextEditorToolbarButtonStyle}"
Command="FindButtonCommand"
Margin="2,0,10,0">
<Image Name="FindSvgViewbox" Style="{StaticResource TextEditorToolbarIconStylePng}"
Source="/Img/png/enabled/find.png"/>
</Button>
因此,在某些情况下,按钮将被禁用,并且这些图像源将更改为:
FindSvgViewbox.Source = new BitmapImage(new Uri(disabledImagePath));
这是有效的,但是图像实际上只有在我点击其他控件如textboxt或其他按钮后才会改变,因此存在某种延迟或延迟。 什么可能导致问题?
修改
这是按钮的样式:
<Style x:Key="TextEditorToolbarButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Width" Value="30"></Setter>
<Setter Property="Height" Value="30"></Setter>
<Setter Property="BorderThickness" Value="0"></Setter>
<Setter Property="Background" Value="#F1F1F1"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}" BorderThickness="0">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#C5C5C5"/>
</Trigger>
</Style.Triggers>
</Style>
图片来源在按钮的CanExecuteChanged
处理程序中更改:
FindButtonCommand = new RelayCommand(DoFind, o => FindCanExecute);
FindButtonCommand .CanExecuteChanged += (sender, args) =>
{
AppUtils.ChangeIconSource(FindButton, FindSvgViewbox);
};
答案 0 :(得分:1)
如果图像源仅取决于按钮的启用/禁用状态(IsEnabled
属性),则可以使用纯XAML控制图像源值。您的 TextEditorToolbarIconStylePng 样式应如下所示:
<Style x:Key="TextEditorToolbarIconStylePng" TargetType="Image">
<Setter Property="Source" Value="/Img/png/enabled/find.png" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Source" Value="/Img/png/enabled/findDisabled.png" />
</Trigger>
</Style.Triggers>
</Style>
请注意,应该从样式的Source
而不是Setter
元素直接分配初始Image
值,当然您不应该从代码中编辑Source
值。
另请注意,此样式使用图像的 IsEnabled
属性,该属性默认继承自按钮的 IsEnabled
属性(由命令控制),除非您手动编辑图片的属性。