MVVM C # WPF привязка мыши двойным кликом - PullRequest
1 голос
/ 24 сентября 2010

Я хочу скопировать содержимое одного текстового поля в другое текстовое поле, щелкнув мышью.

Как связать событие щелчка мышью?

Ответы [ 7 ]

6 голосов
/ 13 марта 2012

Этот образец предназначен для RightClick, но вы можете настроить событие в соответствии с вашими потребностями:

<TextBox>
    <TextBox.InputBindings>
        <MouseBinding Gesture="RightClick" Command="{Binding YourCommand}" />
    </TextBox.InputBindings>
</TextBox>

Редактировать: Я загрузил на свой SkyDrive пример приложения , которое иллюстрирует, как использовать этот метод для достижения именно того, что вам нужно. Обратите внимание, что он будет работать только для .NET Framework 4 +

3 голосов
/ 24 сентября 2010

Хотите добавить поведение в элемент управления? Просто используйте Рамора !

1 голос
/ 24 сентября 2010

Похоже, вы изобретаете новое поведение для своего текстового поля :)

Я бы просто подумал, понимают ли пользователи вашей программы это поведение и любят ли они его.

Может быть, проще понять функциональность, если просто нажать кнопку - ее также быстрее реализовать:)

0 голосов
/ 23 февраля 2015

Вы можете легко сделать это, создав новое поведение.

<TextBox 
    MouseDoubleClick="SelectAddress" 
    GotKeyboardFocus="SelectAddress" 
    PreviewMouseLeftButtonDown="SelectivelyIgnoreMouseButton" />

Вот код:

private void SelectAddress(object sender, RoutedEventArgs e)
{

    TextBox tb = (sender as TextBox);
    if (tb != null)
    {
        tb.SelectAll();
    }

}

private void SelectivelyIgnoreMouseButton(object sender, 
        MouseButtonEventArgs e)

{

    TextBox tb = (sender as TextBox);
    if (tb != null)
    {
         if (!tb.IsKeyboardFocusWithin)
        {
            e.Handled = true;
            tb.Focus();
        }
    }
}

Пожалуйста, обновите этот фрагмент в соответствии с вашими потребностями.

0 голосов
/ 23 февраля 2015

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

Используйте этот код для TreeView

<TreeView commandBehaviors:MouseDoubleClick.Command="{Binding YourCommand}"
          commandBehaviors:MouseDoubleClick.CommandParameter="{Binding}"
          .../>

Используйте этот код для TreeViewItem

<TreeView ItemsSource="{Binding Projects}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="commandBehaviors:MouseDoubleClick.Command"
                    Value="{Binding YourCommand}"/>
            <Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter"
                    Value="{Binding}"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

Используйте этот код для создания нового поведения MouseDoubleClick

public class MouseDoubleClick
{
    public static DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached("Command",
        typeof(ICommand),
        typeof(MouseDoubleClick),
        new UIPropertyMetadata(CommandChanged));

    public static DependencyProperty CommandParameterProperty =
        DependencyProperty.RegisterAttached("CommandParameter",
                                            typeof(object),
                                            typeof(MouseDoubleClick),
                                            new UIPropertyMetadata(null));

    public static void SetCommand(DependencyObject target, ICommand value)
    {
        target.SetValue(CommandProperty, value);
    }

    public static void SetCommandParameter(DependencyObject target, object value)
    {
        target.SetValue(CommandParameterProperty, value);
    }
    public static object GetCommandParameter(DependencyObject target)
    {
        return target.GetValue(CommandParameterProperty);
    }

    private static void CommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        Control control = target as Control;
        if (control != null)
        {
            if ((e.NewValue != null) && (e.OldValue == null))
            {
                control.MouseDoubleClick += OnMouseDoubleClick;
            }
            else if ((e.NewValue == null) && (e.OldValue != null))
            {
                control.MouseDoubleClick -= OnMouseDoubleClick;
            }
        }
    }

    private static void OnMouseDoubleClick(object sender, RoutedEventArgs e)
    {
        Control control = sender as Control;
        ICommand command = (ICommand)control.GetValue(CommandProperty);
        object commandParameter = control.GetValue(CommandParameterProperty);
        command.Execute(commandParameter);
    }
}
0 голосов
/ 24 сентября 2010

Я не уверен, что именно вы хотите связать.

Насколько я знаю, не существует легкодоступного события MouseClick.

Click Событие, которое вы найдете на Button, наследуется от ButtonBase и недоступно для большинства элементов управления.

MouseDoubleClick наследуется от Control и доступно для любого, производного от него.

в вашем примере это звучит так, как будто простой Button с обработанным событием Click может помочь.

Чтобы привязать событие click, вам просто нужно указать обработчик событиядля события в Button.

Что-то вроде:

XAML:

<TextBox Name=TextBoxOne />
<TextBox Name=TextBoxTwo />

<Button Click="CopyTextButton_Click"/>

А в вашем коде позади:

void CopyTextButton_Click(object sender, RoutedEventArgs e)
{
    //Copy the text and anything else you need done
}

В противном случае, если это более специализированный сценарий, вы можете исследовать, используя UserControl или, как AndrewS ответил выше, команду.

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

0 голосов
/ 24 сентября 2010

Я думаю, вы можете связать жесты мыши с командами.Взгляните на это: http://www.thejoyofcode.com/Invoking_a_Command_on_a_Double_Click_or_other_Mouse_Gesture.aspx

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