2013-11-18 6 views
0

Я запускаю WPF сегодня, я пытаюсь реализовать пользовательский элемент управления.WPF Custom Control - Button Event

Моя проблема в том, что я не могу выбрать элемент в шаблоне.

Мой код:

[Generic.xaml]

<Style x:Key="{x:Type local:ImageButton}" TargetType="{x:Type local:ImageButton}" BasedOn="{StaticResource {x:Type Button}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ImageButton}"> 
       <StackPanel> 
        // -> My image 
        <Image Source="{Binding Path=Tag, RelativeSource={RelativeSource TemplatedParent}}"></Image> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

[ImageButton.cs]

public class ImageButton : Button 
{ 
    public Image imageOff { get; set; } 
    public Image imageOn { get; set; } 

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

    public ImageButton() 
     : base() 
    { 
     this.MouseEnter += new MouseEventHandler(SetImageON); 
    } 

    public void SetImageON(object sender, MouseEventArgs e) 
    { 
     //Here i wanna change my image from StackPanel 
    } 
} 

Я на хорошем пути? Как я могу изменить это изображение?

ответ

0

отправитель - это ваш контроль, поэтому вы также можете это сделать. SetCurrentValue.

public void SetImageON(object sender, MouseEventArgs e) 
{ 
    ImageButton btn = (ImageButton)sender; 
    btn.SetCurrentValue(TagProperty,imageOn.Source); 
} 

кажется, что вы могли бы wan't только сохранить источник вашего изображения в контроле, а не всего изображения.

Но если вы wan't использовать объект изображения в коде, как этот

XAML: в шаблоне.

<StackPanel x:Name="myPanel" /> 

CS: под вашим контролем:

myPanel.Children.Add(imageOn); 
0

дать имя вашему образу, как x:Name="PART_Image". Затем в вашем коде стоит переопределить метод OnApplyTemplate и сохранить его в переменной.

private Image PART_Image; 

public override void OnApplyTemplate() 
{ 
    PART_Image = this.GetTemplatedChild("PART_Image"); 
} 

В этом случае вы можете получить доступ к нему в вашем методе, как:

this.PART_Image.Visibility = Visibility.Collapsed; 
0

Вы можете добиться того, что вы хотите с триггером:

<Style x:Key="{x:Type local:ImageButton}" TargetType="{x:Type local:ImageButton}" BasedOn="{StaticResource {x:Type Button}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ImageButton}"> 
       <StackPanel> 
        <Image Source="{Binding Path=imageOff.Source, RelativeSource={RelativeSource TemplatedParent}}"> 
         <Image.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="Image.Source" Value="{Binding Path=imageOn.Source, RelativeSource={RelativeSource TemplatedParent}}" /> 
          </Trigger> 
         </Image.Triggers> 
        </Image> 
       </StackPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Таким образом, вам не нужно событие в коде. Если вы хотите, вы могли бы сделать imageOff и IMAGEON DependencyProperties, таким образом можно определить исходные изображения в XAML также:

public class ImageButton : Button { 
    public static readonly DependencyProperty imageOffProperty = DependencyProperty.Register("imageOff", typeof(Image), typeof(ImageButton), new PropertyMetadata(null)); 
    public Image imageOff { 
     get { return (Image)GetValue(imageOffProperty); } 
     set { SetValue(imageOffProperty, value); } 
    } 

    public static readonly DependencyProperty imageOnProperty = DependencyProperty.Register("imageOn", typeof(Image), typeof(ImageButton), new PropertyMetadata(null)); 
    public Image imageOn { 
     get { return (Image)GetValue(imageOnProperty); } 
     set { SetValue(imageOnProperty, value); } 
    } 

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

Так что, когда вы объявляете ImageButton в XAML, вы можете сделать что-то вроде этого:

<local:ImageButton imageOn="/Resource/Path/To/imageOn.png" imageOff="/Resource/Path/To/imageOff.png" />