Создать пользовательский обработчик события щелчка для пользовательского элемента управления WPF, который содержит кнопку? - PullRequest
3 голосов
/ 20 мая 2009

Вы когда-нибудь сталкивались с проблемой при назначении обработчика событий щелчка для своего пользовательского пользовательского элемента управления 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>

Пояснение:

в пользовательском контроле, когда вы нажимаете вложенную кнопку, он запускает свой родительский пользовательский обработчик "Клика".

Есть ли элегантный способ добиться того же эффекта?

Ответы [ 3 ]

2 голосов
/ 20 мая 2009

Исходя из того, что говорил mdm20 ... Почему вы создаете UserControl (набор элементов управления, сгруппированных в 1), когда вы можете гораздо проще создать CustomControl (элемент управления, который расширяет функциональность существующего элемента управления, например, как кнопка)? Предполагая, что кнопка - единственный элемент управления, который вам нужен в CustomButton, я настоятельно рекомендую CustomControl над тем, что у вас есть (UserControl).

Пример UserControl против CustomControl здесь

Надеюсь, это поможет!

1 голос
/ 20 мая 2009

Если вы реализуете кнопку, почему бы просто не получить ее из кнопки?

Чтобы ответить на ваш вопрос, все, что вам нужно, это.

if (Click != null) Click(this, EventArgs.Empty);
0 голосов
/ 20 мая 2009

Не удалось эту строку:

(((sender as Button).Parent as Grid).Parent as CustomButton).Click(sender, e);

подлежит замене на

this.Click(sender, e);

Кроме этого, ответ зависит от того, какое именно поведение вы хотите. Если вы хотите нажать на событие вашего пользовательского элемента управления, чтобы оно срабатывало только при нажатии на внутреннюю кнопку, то я думаю, что вы обрабатываете это правильно. С другой стороны, если вы хотите, чтобы событие click срабатывало всякий раз, когда вы щелкаете в любом месте в пределах пользовательского элемента управления, то вы, вероятно, лучше всего стилизуете или наследуете от стандартного элемента управления кнопками. Помните, что в WPF содержимое кнопки может быть любым другим элементом, включая другую кнопку.

...