2013-12-03 1 views
0

вопросов:МОФА, как я могу получить шаблон элемент на пользовательском-управлении, после того, как новый экземпляр немедленно

1, я хочу получить элементы шаблона при вызове конструктора, но возвращать нуль, какой-либо образом?

2, я нашел его, получаю не null obj после загруженного события, но я не хочу этого.

фрагмент кода: (чтобы увидеть мои комментарии)

using System; 
using System.Windows.Controls; 
using System.Windows.Media.Imaging; 
using System.Windows; 
using System.Windows.Input; 

namespace WpfPropertyGrid_Demo 
{ 
    public class MyButton : Control 
    { 
     public static readonly DependencyProperty IsMouseDownProperty; 

     static MyButton() 
     { 
      IsMouseDownProperty = DependencyProperty.Register(
       "IsMouseDown", 
       typeof(bool), 
       typeof(MyButton), 
       new FrameworkPropertyMetadata(false) 
       ); 
     } 

     public bool IsMouseDown 
     { 
      get { return (bool)GetValue(IsMouseDownProperty); } 
      set { SetValue(IsMouseDownProperty, value); } 
     } 

     private BitmapImage _normalImg; 
     private BitmapImage _overImg; 
     private BitmapImage _clickImg; 
     private BitmapImage _disabledImg; 

     public MyButton() 
     { 
      _normalImg = new BitmapImage(new Uri("../../Images/ScrollerBtnBg.png", UriKind.RelativeOrAbsolute)); 
      _overImg = new BitmapImage(new Uri("../../Images/ScrollerThumbnailBtnBg.png", UriKind.RelativeOrAbsolute)); 
      _clickImg = new BitmapImage(new Uri("../../Images/ScrollerThumbnailBg.png", UriKind.RelativeOrAbsolute)); 
      _disabledImg = _clickImg; 

      var style = new Style(typeof(MyButton)); 
      var controlTemplate = new ControlTemplate(); 

      var gridFactory = new FrameworkElementFactory(typeof(Grid)); 
      var imgFacotry = new FrameworkElementFactory(typeof(Image)); 
      imgFacotry.Name = "Image"; 
      imgFacotry.SetValue(Image.SourceProperty, _normalImg); 
      gridFactory.AppendChild(imgFacotry); 

      controlTemplate.VisualTree = gridFactory; 

      var overTrigger = new Trigger(); 
      overTrigger.Property = UIElement.IsMouseOverProperty; 
      overTrigger.Value = true; 
      overTrigger.Setters.Add(new Setter(Image.SourceProperty, _overImg, "Image")); 

      var disabledTriiger = new Trigger(); 
      disabledTriiger.Property = UIElement.IsEnabledProperty; 
      disabledTriiger.Value = false; 
      disabledTriiger.Setters.Add(new Setter(Image.SourceProperty, _disabledImg, "Image")); 

      var downTrigger = new Trigger(); 
      downTrigger.Property = MyButton.IsMouseDownProperty; 
      downTrigger.Value = true; 
      downTrigger.Setters.Add(new Setter(Image.SourceProperty, _clickImg, "Image")); 

      controlTemplate.Triggers.Add(overTrigger); 
      controlTemplate.Triggers.Add(disabledTriiger); 
      controlTemplate.Triggers.Add(downTrigger); 

      style.Setters.Add(new Setter(Control.TemplateProperty, controlTemplate)); 
      this.PreviewMouseDown += new System.Windows.Input.MouseButtonEventHandler(MyButton_PreviewMouseDown); 
      this.PreviewMouseUp += new System.Windows.Input.MouseButtonEventHandler(MyButton_PreviewMouseUp); 
      this.MouseLeave += new System.Windows.Input.MouseEventHandler(MyButton_MouseLeave); 
      this.MouseEnter += new MouseEventHandler(MyButton_MouseEnter); 

      Style = style; 

      // 1、why cann't find "Image" element, it return null obj, i wanna get it immediately, any way? 
      // 2、return not null after loaded event 
      // var image = controlTemplate.FindName("Image", this); 

      this.Loaded += new RoutedEventHandler(MyButton_Loaded); 
     } 

     void MyButton_MouseEnter(object sender, MouseEventArgs e) 
     { 
      IsMouseDown = e.LeftButton == MouseButtonState.Pressed; 
     } 

     void MyButton_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      IsMouseDown = false; 
     } 

     void MyButton_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      IsMouseDown = false; 
     } 

     void MyButton_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      IsMouseDown = true; 
     } 

     void MyButton_Loaded(object sender, RoutedEventArgs e) 
     { 
      // return not null after loaded event 
      var image = this.Template.FindName("Image", this) as Image; 
     } 
    } 
} 

ответ

0

Попробуйте Visual Helper Class here Я надеюсь, что это поможет

+0

Thks для вашего answer.but я пытаюсь этот код: вар изображение = VisualHelper.FindVisualChildByName (это, «Изображение»); // также возвращает значение null перед добавлением кода загруженного события – Jave

 Смежные вопросы

  • Нет связанных вопросов^_^