MVVM C#WPF绑定鼠标双击

时间:2010-09-24 03:28:00

标签: wpf mvvm

我想通过单击鼠标将一个文本框的内容复制到另一个文本框。

如何绑定鼠标单击事件?

7 个答案:

答案 0 :(得分:6)

此示例适用于RightClick,但您可以根据需要调整事件:

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

编辑:我在我的SkyDrive上传了一个sample app,它说明了如何使用此方法来实现您的需求。请注意,它仅适用于.NET Framework 4 +

答案 1 :(得分:3)

想要向控件添加行为吗?只需使用Ramora pattern

答案 2 :(得分:1)

听起来你正在为你的文本框发明一种新行为:)

我只会考虑您的程序的用户是否理解并喜欢此行为。

如果它只是一个你必须点击的按钮,它可能更容易理解它的功能 - 实现起来也更快:)

答案 3 :(得分:0)

我认为你可以将鼠标手势绑定到命令。看看这个:http://www.thejoyofcode.com/Invoking_a_Command_on_a_Double_Click_or_other_Mouse_Gesture.aspx

答案 4 :(得分:0)

我不确定你想要绑定到底是什么。

据我所知,没有现成的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调查一个命令。

希望它有所帮助。

答案 5 :(得分:0)

希望这有帮助

将此代码用于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);
    }
}

答案 6 :(得分:0)

您可以通过创建新行为轻松完成此操作。

<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();
        }
    }
}

请根据您的需要更新此代码段。