如何以编程方式更改按钮的图像源?
问题描述:
我有这样一个按钮:如何以编程方式更改按钮的图像源?
<Button Name="Btn_Import"
Grid.Row="33"
Grid.Column="15"
Grid.ColumnSpan="36"
Grid.RowSpan="36"
Click="Btn_Import_Click"
MouseEnter="import_desc"
MouseLeave="desc_clear">
<Button.Template>
<ControlTemplate>
<Grid RenderTransformOrigin="0.5,0.5"
x:Name="bg">
<Image Name="import_image"
Source="/Images/01_Main_Screen/MS_START_IMPORT_NORMAL.png" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<!-- hover effect -->
<Setter TargetName="import_image"
Property="Source"
Value="/Images/01_Main_Screen/MS_START_IMPORT_OVER.png" />
</Trigger>
<Trigger Property="Button.IsPressed"
Value="True">
<!-- press effect -->
<Setter TargetName="bg"
Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="0.9"
ScaleY="0.9" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
<Button.Style>
<!-- initially disabled-->
<Style TargetType="Button">
<!--<Setter Property="IsEnabled" Value="False" />-->
<!--<Setter Property="Opacity" Value="0.3" />-->
</Style>
</Button.Style>
</Button>
,然后在后面的代码的某个时刻,我在本地的图像源切换到别的东西是这样的:
ControlTemplate ct1 = Btn_Import.Template;
Image btnImage1 = (Image)ct1.FindName("import_image", Btn_Import);
btnImage1.Source = new BitmapImage(new Uri("/Images/01_Main_Screen/MS_START_IMPORT_FINISH.png", UriKind.RelativeOrAbsolute));
这样做后,我失去了“鼠标悬停”效果可能是因为我覆盖了原始按钮的模板。如何在本地再次“告诉”按钮在鼠标上触发?或换句话说,如何在C#中编写此代码:
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<!-- hover effect -->
<Setter TargetName="import_image" Property="Source"
Value="/Images/01_Main_Screen/MS_START_IMPORT_OVER.png" />
</Trigger>
答
这可能是因为属性值的优先级。我在模板中添加了一些资源。现在,当您想要更改某个源值时,请通过访问资源来完成。
另请注意,对于绑定到我们的资源,我们使用DynamicResource,否则任何代码级别的更改将不可见。
下面的变化工作就像一阵轻而易举的事情。
<Button.Template>
<ControlTemplate>
<ControlTemplate.Resources>
<Image x:Key="NORMAL" Source="images/01_Main_Screen/MS_START_IMPORT_NORMAL.png"/>
<Image x:Key="OVER" Source="images/01_Main_Screen/MS_START_IMPORT_OVER.png"/>
</ControlTemplate.Resources>
<Grid RenderTransformOrigin="0.5,0.5"
x:Name="bg">
<Label x:Name="import_image" Content="{DynamicResource NORMAL}" HorizontalContentAlignment="Center" HorizontalAlignment="Stretch"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<!-- hover effect -->
<Setter TargetName="import_image"
Property="Content"
Value="{DynamicResource OVER}" />
<Setter TargetName="bg"
Property="Background"
Value="Purple" />
</Trigger>
<Trigger Property="Button.IsPressed"
Value="True">
<!-- press effect -->
<Setter TargetName="bg"
Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="0.9"
ScaleY="0.9" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
然后在代码中,
ControlTemplate ct1 = Btn_Import.Template;
Image normalImage = (Image)ct1.Resources["NORMAL"];
normalImage.Source = new BitmapImage(new Uri("Images/01_Main_Screen/MS_START_IMPORT_FINISH.png", UriKind.RelativeOrAbsolute));
+0
请注意,如果您不更改图像来源,那么您也可以使用ImageBrush,因为笔刷不会允许自己在代码中进行更改。 – AnjumSKhan
使用数据隐藏代码结合代替。这就是WPF是如何被设计用来在你尝试以旧的WinForms方式做事情时遇到无数问题的。 –
一旦你在按钮上设置了Source,你就设置了Button的Source属性的本地值,它是一个DependencyProperty(Button.SourceProperty)。本地值覆盖任何其他可能的值,直到它被清除。 – user2250152