2013-05-26 117 views
1

我剛開始學習WPF。WPF中的自定義控件

我有一個圖像按鈕。像Image+Text

<Button Height="67" Name="Button1" Width="228" HorizontalContentAlignment="Left"> 
     <StackPanel Orientation="Horizontal" > 
      <Image Source="Images/add.png" Stretch="Uniform"></Image> 
      <TextBlock Text=" Create Company" VerticalAlignment="Center" FontSize="20"></TextBlock> 
     </StackPanel> 
    </Button> 

現在我想在上面的格式中添加更多的按鈕。 所以我必須一次又一次地寫相同的代碼。

所以我決定有一個customButton來輕鬆完成我的工作。 我試圖創建自定義控件。

我在那裏添加了一個名爲Image的屬性。 現在我應該如何給這個財產賦予價值?

我會走錯路嗎?

+1

kmatyaszek已經提供了有關如何創建一個自定義的合作全面的回答ntrol。然而,解決你的問題有一個很快的方法,它使用'Content'和'Tag'屬性分別包含圖像和文本。它只涉及創建Style或DataTemplate資源,並且會避免創建自定義或用戶控件或派生的Button控件。如果你有興趣,我會寫一個答案。 – Clemens

回答

5

在這裏,你有教程how to create a custom control

[1.]添加名爲「ButtonImg」的新項目「Custom Control(WPF)」。

經過這一步,VS爲您創建兩個文件:「ButtonImg.cs」和「/Themes/Generic.xaml」。

[2.]添加幾個依賴屬性爲「ButtonImg.cs」文件:

我創建屬性:圖像源,文本,圖像的寬度和高度。

public class ButtonImg : Control 
{ 
    static ButtonImg() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonImg), new FrameworkPropertyMetadata(typeof(ButtonImg))); 
    } 

    public ImageSource ImageSource 
    { 
     get { return (ImageSource)GetValue(ImageSourceProperty); } 
     set { SetValue(ImageSourceProperty, value); } 
    }   
    public static readonly DependencyProperty ImageSourceProperty = 
     DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ButtonImg), new PropertyMetadata(null)); 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 
    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(ButtonImg), new PropertyMetadata(string.Empty)); 

    public double ImageWidth 
    { 
     get { return (double)GetValue(ImageWidthProperty); } 
     set { SetValue(ImageWidthProperty, value); } 
    } 
    public static readonly DependencyProperty ImageWidthProperty = 
     DependencyProperty.Register("ImageWidth", typeof(double), typeof(ButtonImg), new PropertyMetadata((double)30)); 

    public double ImageHeight 
    { 
     get { return (double)GetValue(ImageHeightProperty); } 
     set { SetValue(ImageHeightProperty, value); } 
    } 
    public static readonly DependencyProperty ImageHeightProperty = 
     DependencyProperty.Register("ImageHeight", typeof(double), typeof(ButtonImg), new PropertyMetadata((double)30)); 
} 

[3.]在這一步中,您必須爲您的新自定義控件創建模板。所以,你必須編輯下列文件「/Themes/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:WpfButtonImg"> 

    <Style TargetType="{x:Type local:ButtonImg}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:ButtonImg}">     
        <Button> 
         <Button.Content> 
          <StackPanel Orientation="Horizontal"> 
           <Image Source="{TemplateBinding ImageSource}" 
             Height="{TemplateBinding ImageHeight}" Width="{TemplateBinding ImageWidth}" 
             Stretch="Uniform" /> 
           <TextBlock Text="{TemplateBinding Text}" Margin="10,0,0,0" VerticalAlignment="Center" FontSize="20" /> 
          </StackPanel> 
         </Button.Content> 
        </Button> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

[4]使用這個新的自定義控件的例子是以下幾點:

首先,你必須添加相應的命名空間:

xmlns:MyNamespace="clr-namespace:WpfButtonImg" 

現在你可以使用這樣的:

<MyNamespace:ButtonImg ImageSource="/Images/plug.png" Text="Click me!" /> 
+0

謝謝。它工作得很好。 – Vishal

+0

我可以使用公共類ButtonImg:按鈕或公共類ButtonImg:ToggleButton而不是公共類ButtonImg:控制? – Vishal

+0

@威爾,當然是。基本類型爲'Button'的版本比較好,因爲你有例如點擊事件。 – kmatyaszek