2012-06-03 216 views
0

我想在wpf中設計一個靈活的圖像按鈕。
首先,我命名空間 '的ImageButton' 創建一個WPF自定義控件庫象下面這樣:wpf中自定義控件的默認樣式

namespace ImageButton 
{ 

    public class ImageButton : Button 
    { 

     static ImageButton() 
     { 
       DefaultStyleKeyProperty.OverrideMetadata(typeof(ImageButton), new FrameworkPropertyMetadata(typeof(ImageButton))); 
     } 


      #region DisplayMode 
      [System.ComponentModel.Category("ImageButton")] 

      public ImageDisplayMode DisplayMode 
      { 
       get { return (ImageDisplayMode)GetValue(DisplayModeProperty); } 
       set { SetValue(DisplayModeProperty, value); } 
      } 

      public static readonly DependencyProperty DisplayModeProperty = 
     DependencyProperty.Register("DisplayMode", typeof(ImageDisplayMode), typeof(ImageButton), new FrameworkPropertyMetadata(ImageDisplayMode.ImageAboveText), displaymodevalidate); 

      public static bool displaymodevalidate(object value) 
      { 
       return value is ImageDisplayMode; 
      } 


      #endregion 

     } 
} 
在命名空間

「的ImageButton」 我定義了一個名爲 'ImageDisplayMode' 枚舉象下面這樣:

public enum ImageDisplayMode 
{ 
    ImageAboveText = 1, 
    TextAboveImage = 2, 
    ImageBeforeText = 3, 
    TextBeforeImage = 4 
} 

和Generic.xaml文件修改象下面這樣:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:ImageButton"> 
    <Style x:Name="style1" TargetType="{x:Type local:ImageButton}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:ImageButton}"> 
        <Button Background="Transparent"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
            <ColumnDefinition/> 
            <ColumnDefinition/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
            <RowDefinition/> 
            <RowDefinition/> 
          </Grid.RowDefinitions> 
          <Image Grid.ColumnSpan="2" Name="img1" Width="{TemplateBinding ImageWidth}" Stretch="{TemplateBinding ImageStretch}" Height="{TemplateBinding ImageHeight}" Source="{TemplateBinding Image}"/> 
          <TextBlock Grid.ColumnSpan="2" Grid.Row="1" Name="lbl1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Text="{TemplateBinding Text}"/> 

         </Grid> 
        </Button> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

的上面的代碼的結果是如下圖所示:

[圖像]
文本

我想: 當我改變的ImageButton的 'DISPLAYMODE' 屬性的值,對於每個可能的值,則控制改變爲以下的形式:

1 ---- ---------------------------------
[Image]
文字

2 ---- ---------------------------------
Text
[Image]

3 -------------------------------------
[Image ]文本

4 --------------------------------------
Text [Image ]

我想,我必須在電網Generic.xaml碼定義觸發象下面這樣:

<Grid.Triggers> 
    <Trigger Property="DisplayMode" Value="2"> 
     <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
     <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
    </Trigger> 
</Grid.Triggers> 

請告訴我:
如何CA我做到了嗎?

非常感謝你

回答

0

感謝fmunkert ...
我將我的觸發器ControlTemplate.Triggers和更改Trigger.Value從「2」到「ImageAboveText」(我的自定義枚舉的項目之一)如下圖所示:

編輯之前:

編輯
<Trigger Property="DisplayMode" Value="2"> 
    <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
    <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
</Trigger> 

後:

<Trigger Property="DisplayMode" Value="ImageAboveText"> 
    <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
    <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
</Trigger> 

我的問題成功解決了....
謝謝。

1

添加觸發器,以你的風格(即<Style.Triggers>...</Style.Triggers>)。

I.e.是這樣的:

<Style.Triggers> 
    <Trigger Property="DisplayMode" Value="2"> 
     <Setter Property="Grid.Row" TargetName="lbl1" Value="0"/> 
     <Setter Property="Grid.Row" TargetName="img1" Value="1"/> 
    </Trigger> 
</Style.Triggers> 
+0

謝謝你,我測試你的答案,但有錯誤:我將我的觸發器移動到controltemplate,它的錯誤已解決,但無法正常工作。 –