我有这样一个按钮:如何以编程方式更改按钮的图像源?
<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>
使用数据隐藏代码结合代替。这就是WPF是如何被设计用来在你尝试以旧的WinForms方式做事情时遇到无数问题的。 –
一旦你在按钮上设置了Source,你就设置了Button的Source属性的本地值,它是一个DependencyProperty(Button.SourceProperty)。本地值覆盖任何其他可能的值,直到它被清除。 – user2250152