2014-12-11 4 views
1

Я выполнил базовый пользовательский контроль WPF для всех моих пользовательских элементов для наследования. В этом базовом классе usercontrol я хочу иметь кнопку, связанную с событием клика. Я сделал это так:WPF Button динамически добавлен: события не срабатывают

public class MBaseUserControl : UserControl 
{ 
    //[...] 
    protected override void OnContentChanged(object oldContent, object newContent) 
    { 
     base.OnContentChanged(oldContent, newContent); 

     StackPanel mainPanel = new StackPanel(); 
     EditButton = new Button(); 
     EditButton.Height = EditButton.Width = 24; 
     EditButton.MouseEnter += EditButton_MouseEnter; 
     EditButton.MouseLeave += EditButton_MouseLeave; 
     EditButton.Click += new RoutedEventHandler(EditButton_Click); 
     EditButton.Background = Brushes.Transparent; 
     EditButton.BorderBrush = Brushes.Transparent; 
     EditButton.HorizontalAlignment = System.Windows.HorizontalAlignment.Right; 
     EditButton.VerticalAlignment = System.Windows.VerticalAlignment.Top; 

     StackPanel buttonPanel = new StackPanel(); 
     Image editButtonImage =  ImageTools.ConvertDrawingImageToWPFImage(Properties.Resources.edit, 24, 24); 
     buttonPanel.Children.Add(editButtonImage); 

     EditButton.Content = buttonPanel; 

     mainPanel.Children.Add(EditButton); 
     //Add this to new control 
     ((IAddChild)newContent).AddChild(mainPanel); 
     SetCMSMode(false); 
    } 
} 

Но когда я нажимаю кнопку на GUI, ничего не стреляет (ни событие мыши или щелчок). Что я пропустил?

Спасибо заранее!

+0

Я бы предпочел изменить базовый UserControl, чтобы иметь «статические» элементы управления, такие как кнопка редактирования по умолчанию, таким образом, вы могли бы привязать их к командам, определенным в базе, и не беспокоиться о подключении обработчиков событий, когда контент изменения. Вы можете добавить ContentControl в свой стиль по умолчанию и связать его с DependencyProperty на базе. – Xtr

+0

Мои навыки WPF, кажется, не настолько велики, чтобы понять, что вы будете делать. У вас есть пример этого? – cdie

+0

Возможно, вам стоит начать с шаблона MVVM. Много ресурсов в Интернете для этого, просто Google. – Xtr

ответ

1

Вы можете попробовать шаблон UserControl, чтобы его Content показали внутри некоторого другого контента. Заметьте, это непроверено, но я думаю, что он должен работать.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:l="clr-namespace:DemoUni"> 
    <ControlTemplate x:Key="SomeKey" TargetType="UserControl"> 
     <Grid x:Name="PART_Grid"> 
      <ContentPresenter x:Name="PART_Content" Content="{Binding}"/> 
      <!-- ... some other content --> 
     </Grid> 
    </ControlTemplate> 
</ResourceDictionary> 

В конструкторе UserControl

var dictionary = new ResourceDictionary(); 
// xaml containing control template 
dictionary.Source = new Uri("/ProjectName;component/MyUserControlTemplate.xaml", UriKind.Relative); 
Template = dictionary["SomeKey"] as ControlTemplate; 

Чтобы получить доступ другого содержимого (Grid как пример)

private Grid _partGrid; 
    private Grid PartGrid 
    { 
     get 
     { 
      if (_partGrid == null) 
       _partGrid = (Grid)Template.FindName("PART_Grid", this); 
      return _partGrid; 
     } 
    } 

Маленький недостаток заключается в том, что вы не можете получить доступ к PART с в конструктор, так что вы должны использовать Loaded of UserControl для подключения событий (подписаться на Loaded в конструкторе, подписаться на события кнопки в Loaded).

+0

Если я продолжу это, мне нужно будет подписаться на Loaded в каждом UserControl, который я создаю и переопределяю поведение моей кнопки в каждом UserControl, хотеть сделать. Моя первая цель - определить только один раз в базовом классе поведение editButton – cdie

+0

Выше код точно соответствует базовому классу. Возможно, вы неправильно поняли мою подписку на 'Loaded' *, потому что вы [не можете переопределить] (http://stackoverflow.com/a/6568375/1997232) (нет виртуального' OnLoaded'). – Sinatr

+0

Хм, я понимаю, что вы имели в виду. Но теперь я выполнил ваш код, сетка getter не работает, возвращает null. Я не понимаю, почему (с тех пор я не играл с шаблоном) – cdie

0

возможно добавление нового MouseEventHandler к коду:

EditButton.MouseEnter += new MouseEventHandler(EditButton_MouseEnter); 
EditButton.MouseLeave += new MouseEventHandler(EditButton_MouseLeave); 
+0

Ничего не меняет, я уже пробовал с событием click (см. Код) – cdie

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