Использование события кнопки в пользовательском элементе управления из главного окна - PullRequest
1 голос
/ 28 февраля 2012

У меня есть пользовательский элемент управления wpf

<StackPanel Orientation="Horizontal">
            <TextBox Name="txbInterval" Text="5"/>
            <Image Name="imgStart" Source="Images/start.png"/>
            <Image Name="imgStop" Source="Images/stop.png"/>
</StackPanel>

Я использую этот элемент управления в своем приложении много раз.Этот элемент управления может запускать / останавливать выполнение задач в моем собственном планировщике.При щелчке imgStart он должен создать новый экземпляр задачи с аргументом txbInterval.Text.У меня есть это в моем MainWindow.xaml

<wp:TaskManager x:Name="tmToolsArMail"/>
<wp:TaskManager x:Name="tmToolsArSail"/>

, и мне нужно в Mainwindow.xaml.cs что-то вроде этого

tmToolsArMail_imgStart_mouseUp(...)
... new MyTask(tmToolsArMail.txbInterval.Text) ...

tmToolsArSail_imgStart_mouseUp(...)
... new MyAnotherTask(tmToolsArSail.txbInterval.Text) ...

Как?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2012

IMO, самый простой способ реализовать это - создать 2 RoutedEvent (Start и Stop) и 1 DependencyProperty (Interval) в вашем UserControl, а затем подписать эти события на родительском элементе управления (MainWindow)

1 голос
/ 28 февраля 2012

Мне нравится реализовывать прикрепленные команды, если вы хотите выполнить команду в стиле клика затем вы можете присоединить его к любому элементу управления на более позднем этапе (все это очень MVVM).

Это очень хорошая статья на эту тему

Вот обсуждение переполнения стека, которое показывает альтернативы

1 голос
/ 28 февраля 2012

Я бы добавил RoutedEvent s в пользовательский элемент управления следующим образом:

    public MyUserControl()
    {
        InitializeComponent();

        imgStart.MouseUp += imgStart_MouseUp;
        imgStop.MouseUp += imgStop_MouseUp;
    }

    // Create custom routed events by first registering a RoutedEventID
    // These events use the bubbling routing strategy
    public static readonly RoutedEvent StartEvent = EventManager.RegisterRoutedEvent(
        "Start", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));

    public static readonly RoutedEvent StopEvent = EventManager.RegisterRoutedEvent(
        "Stop", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));

    // Provide CLR accessors for the events
    public event RoutedEventHandler Start
    {
        add { AddHandler(StartEvent, value); }
        remove { RemoveHandler(StartEvent, value); }
    }

    // Provide CLR accessors for the events
    public event RoutedEventHandler Stop
    {
        add { AddHandler(StopEvent, value); }
        remove { RemoveHandler(StopEvent, value); }
    }

    // This method raises the Start event
    void RaiseStartEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(MyUserControl.StartEvent);
        RaiseEvent(newEventArgs);
    }

    // This method raises the Stop event
    void RaiseStopEvent()
    {
        RoutedEventArgs newEventArgs = new RoutedEventArgs(MyUserControl.StopEvent);
        RaiseEvent(newEventArgs);
    }

    private void imgStart_MouseUp(object sender, MouseButtonEventArgs e)
    {
        RaiseStartEvent();
    }

    private void imgStop_MouseUp(object sender, MouseButtonEventArgs e)
    {
        RaiseStopEvent();
    }

Тогда любой код, который вызывает этот UserControl, может подписаться на эти события Start и Stop и выполнитьобработка вам требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...