C# 如何区分用户控件内部和外部的单击输入?

C# 如何区分用户控件内部和外部的单击输入?,c#,wpf,mvvm,user-controls,inputbinding,C#,Wpf,Mvvm,User Controls,Inputbinding,(请将下面所述的每个控件作为使用MVVM模式创建的控件) 因此,我有一个UserControl,我把它放在我的main窗口上。我想要我的UserControl,如果单击(在main窗口中,在UserControl内部),背景将变为另一种颜色,如果我在main窗口中,但在UserControl之外,则UserControl的背景将变为原始颜色 我所尝试的: 我尝试在UserControl.InputBindings中应用一个命令来检测鼠标输入(MouseBinding),但唯一引发的MouseBi

(请将下面所述的每个控件作为使用MVVM模式创建的控件)

因此,我有一个
UserControl
,我把它放在我的
main窗口上。我想要我的
UserControl
,如果单击(在
main窗口中,在
UserControl
内部),背景将变为另一种颜色,如果我在
main窗口中,但在
UserControl
之外,则
UserControl
的背景将变为原始颜色

我所尝试的:

  • 我尝试在
    UserControl.InputBindings
    中应用一个命令来检测鼠标输入(
    MouseBinding
    ),但唯一引发的
    MouseBinding
    窗口中的
    MouseBinding
    。InputBindings
    (当点击输入在
    用户控件
    之外时,只应引发),但显然,无论在哪里发生点击,唯一引发的
    鼠标绑定
    只有
    窗口中的一个。InputBindings
  • 窗口中的
    鼠标绑定
    用户控件.输入绑定
    中的
    命令参数
    区别开来
  • 问题:

  • 如何区分用户控件内部和外部的
    鼠标绑定

  • 谢谢

    解决方案很简单。只需将
    PreviewMouseDown
    事件处理程序附加到
    窗口和
    用户控件
    上,并在
    窗口中处理这两个事件


    为什么不仅仅是
    ?您能添加更多细节吗?UserControl做什么?在我看来,最常见的情况是人们希望显示某个元素是否具有焦点的视觉指示。这是您的情况吗?是的。没错。但我还想访问它的“聚焦”布尔值(类似于
    if(focused)){//do something}
    what
    something
    ?也可以通过触发器实现某些功能…我的意思是在
    UserControl
    的ICommand的
    CanExecute
    中返回“焦点布尔值”哈…是的,这些天我通常会选择最简单的解决方案,而不是最好的。我经常发现,当我推出大炮并提出一个伟大的解决方案时,我最终不得不回答一百万条评论,问更多的问题,我只是没有时间(或耐心)再这样做。这是正确的,但我正在尝试这样做“正确的MVVM”方式。@MosesAprico澄清一下,此解决方案不会“中断”“MVVM,因为它将代码隐藏用于特定于UI的目的,这是可以的。我同意这里的@HighCore。这纯粹是与UI相关的,因此在视图模型中不需要。但是,当您确实需要处理视图模型中的事件时,可以将其包装在附加属性中。请参阅我对问题的回答,以了解它是如何完成的。
    <Window ... PreviewMouseDown="Window_PreviewMouseDown">
        <UserControl Name="Control" PreviewMouseDown="UserControl_PreviewMouseDown" ... / >
    </Window>
    
    private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        Control.Background = someNewColourBrush;
    }
    
    
    private void UserControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        Control.Background = originalColourBrush;
    }