2012-10-03 139 views
0

我創建了一個具有3個狀態(正常,單擊,禁用)的自定義WPF按鈕。對於每個州我都有不同的形象。我在我的項目中的不同位置使用這個常規按鈕,每次使用.CS文件中的屬性加載不同的圖像。創建一個動態更改其內容的WPF按鈕

<Button.Resources> 
    <ImageSource x:Key="Normal">..\Resources\DefaultNormal.png</ImageSource> 
    <ImageSource x:Key="Disabled">..\Resources\DefaultDisabled.png</ImageSource> 
    <ImageSource x:Key="Pressed">..\Resources\DefaultPressed.png</ImageSource> 
</Button.Resources> 
<Button.Template> 
    <ControlTemplate TargetType="{x:Type Button}"> 
     <Grid> 
      <Image Name="normal" Source="{DynamicResource Normal}" Stretch="Fill"/> 
      <Image Name="pressed" Source="{DynamicResource Pressed}" Stretch="Fill" Visibility="Hidden"/> 
      <Image Name="disabled" Source="{DynamicResource Disabled}" Stretch="Fill" Visibility="Hidden"/> 
     </Grid> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsPressed" Value="True"> 
       <Setter TargetName="normal" Property="Visibility" Value="Hidden"/> 
       <Setter TargetName="pressed" Property="Visibility" Value="Visible"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="False"> 
       <Setter TargetName="normal" Property="Visibility" Value="Hidden"/> 
       <Setter TargetName="disabled" Property="Visibility" Value="Visible"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Button.Template> 

現在我想這樣做與按鈕的文本/內容相同的,但我不能找到類似ImageSource文本的東西。有沒有類似的東西?還是有不同的方式來動態改變文本?

回答

2

它看起來像你只需要添加一個新的元素到你的控制模板;那麼你可以在觸發器中訪問它。

<ControlTemplate TargetType="{x:Type Button}"> 
    <Grid> 
     <Image Name="normal" Source="{DynamicResource Normal}" Stretch="Fill"/> 
     <Image Name="pressed" Source="{DynamicResource Pressed}" Stretch="Fill" Visibility="Hidden"/> 
     <Image Name="disabled" Source="{DynamicResource Disabled}" Stretch="Fill" Visibility="Hidden"/> 
     <TextBlock Name="text" Text="{TemplateBinding Content}" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter TargetName="normal" Property="Visibility" Value="Hidden"/> 
      <Setter TargetName="pressed" Property="Visibility" Value="Visible"/> 
      <Setter TargetName="text" Property="Text" Value="Pressed :)"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter TargetName="normal" Property="Visibility" Value="Hidden"/> 
      <Setter TargetName="disabled" Property="Visibility" Value="Visible"/> 
      <Setter TargetName="text" Property="Text" Value="Disabled :("/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

這裏我添加了一個TextBlock在圖像上,並改變了文字上按/禁用狀態。


如果你想文本字符串作爲資源添加的控制範圍之內,然後使用System命名空間引用String類型。 xmlns:clr="clr-namespace:System;assembly=mscorlib

<Button.Resources> 
    <clr:String x:Key="NormalText">Normal</clr:String> 
    <clr:String x:Key="DisabledText">Disabled</clr:String> 
    <clr:String x:Key="PressedText">Pressed</clr:String> 
</Button.Resources> 
+0

那就是我需要的,謝謝 – meirrav

0

試試這個:

1)添加到命名空間:

xmlns:system="clr-namespace:System;assembly=mscorlib" 

2)添加到資源此項:

<system:String x:Key="myMessage">Button state: clicked!</system:String> 

現在你可以在TextBlock使用文本屬性「myMessage」或Button內容:

<Button Content="{StaticResource myMessage}" />