Я выполнил базовый пользовательский контроль WPF для всех своих пользовательских элементов для наследования. В этом базовом классе usercontrol я хочу иметь кнопку, связанную с событием клика. Я сделал это так:
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);
}
}
Но когда я нажимаю кнопку на графическом интерфейсе, ничего не запускается (ни события мыши, ни события клика). Что я упустил?
Спасибо заранее!
Вы можете попробовать шаблон 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;
}
}
Небольшой недостаток - это то, что вы не можете получить доступ к PARTs в конструкторе, так что вам нужно использовать Loaded
of UserControl
для подключения событий (подписаться на Loaded
in constructor, подписаться на события кнопки в Loaded
).
Loaded
, потому что вы не можете переопределить (нет виртуальной OnLoaded
).
возможно добавление нового MouseEventHandler к вашему коду:
EditButton.MouseEnter += new MouseEventHandler(EditButton_MouseEnter);
EditButton.MouseLeave += new MouseEventHandler(EditButton_MouseLeave);