Вы когда-нибудь сталкивались с проблемой при назначении обработчика событий щелчка для своего пользовательского пользовательского элемента управления WPF с помощью вложенного кнопочного элемента управления? Я делаю.
Когда вы помещаете такой пользовательский элемент управления в главное окно, скажем, Main.xaml, MouseLeftButtonDown не работает, но PreviewMouseLeftButtonDown работает как шарм.
Но представьте, что вы говорите каждому разработчику в вашей команде использовать это событие при использовании вашего пользовательского контроля ... Некоторые пользовательские элементы управления в вашей библиотеке имеют MouseLeftButtonDown, другие PreviewMouseLeftButtonDown .... Это беспорядок, вы согласны?
Итак, у меня есть решение, но я хочу, чтобы кто-нибудь посмотрел, есть ли какой-нибудь элегантный способ создать свой собственный обработчик событий под названием «Click».
В моем пользовательском контроле, называемом CustomButton.xaml.cs, я до сих пор:
public partial class CustomButton: UserControl
{
public CustomButton()
: base()
{
this.InitializeComponent();
}
public delegate void ClickHandler(object sender, EventArgs e);
public event EventHandler Click;
public void Button_Click(object sender, RoutedEventArgs e) {//execute daddy's button click
(((sender as Button).Parent as Grid).Parent as CustomButton).Click(sender, e);
e.Handled = false;
}
В моем CustomButton.xaml
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="YourCompany.UI.Controls.CustomButton" d:DesignHeight="72.5" d:DesignWidth="200">
<UserControl.Resources>
blablabla
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Button Style="{DynamicResource CustomButton}"
Width="{Binding ElementName=CustomButton, Path=ActualWidth}"
Cursor="Hand" Foreground="#ffffff" FontSize="28" Margin="8,8,0,12"
HorizontalAlignment="Left"
Content="Custom Button" Click="Button_Click" />
</Grid>
Теперь в моем звонящем Main.xaml у меня есть:
<Window x:Class="YourCompany.MyProject.Main"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MyProject!" Height="600" Width="800"
MinWidth="800" MinHeight="600" WindowState="Maximized" WindowStartupLocation="CenterScreen"
xmlns:bigbola="clr-namespace:YourCompany.UI.Controls;assembly=YourCompany.UI.Controls">
<mycontrols:CustomButton Name="test" MyImage=".\Images\btnOptions.png" Cursor="Hand"
Texto="See options" Click="test_Click"
Margin="168.367,176.702,253.609,0" ToolTip="See all options" Height="76.682"
VerticalAlignment="Top"></mycontrols:CustomButton>
Пояснение:
в пользовательском контроле, когда вы нажимаете вложенную кнопку, он запускает свой родительский пользовательский обработчик "Клика".
Есть ли элегантный способ добиться того же эффекта?