2015-10-05 113 views
0

我有這樣一個按鈕:如何以編程方式更改按鈕的圖像源?

<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> 
+0

使用數據隱藏代碼結合代替。這就是WPF是如何被設計用來在你嘗試以舊的WinForms方式做事情時遇到無數問題的。 –

+0

一旦你在按鈕上設置了Source,你就設置了Button的Source屬性的本地值,它是一個DependencyProperty(Button.SourceProperty)。本地值覆蓋任何其他可能的值,直到它被清除。 – user2250152

回答

1

這可能是因爲屬性值的優先級。我在模板中添加了一些資源。現在,當您想要更改某個源值時,請通過訪問資源來完成。

另請注意,對於綁定到我們的資源,我們使用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

相關問題