要拖动的 WPF UserControl 容器 Window

WPF UserControl container to Drag Window

我正在尝试制作一个容器 UserControl(如边框)​​,当您在 UserControl 内按住左键单击时,它可以拖动当前 Window。

UserControl.XAML :

<UserControl.InputBindings>
    <MouseBinding Gesture="LeftClick" Command="{Binding DragWindowCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"/>
</UserControl.InputBindings>

UserControl.CS(代码隐藏):

    public partial class DragWindowBorder : UserControl
    {
        #region Commands
        public BaseCommand<Window> DragWindowCommand
        {
            get => new BaseCommand<Window>(/*async*/(window) => {
                window.DragMove();
            });
        }
        #endregion

        public DragWindowBorder()
        {
            InitializeComponent();
        }
    }

BaseCommand.CS :

    public class BaseCommand<T> : ICommand
    {
        #region Variables

        private readonly Action<T> _execute;
        private readonly Func<T, bool> _canExecute;
        public event EventHandler CanExecuteChanged;

        #endregion

        #region Methods
        public BaseCommand(Action<T> execute) : this(execute, null) { }

        public BaseCommand(Action<T> execute, Func<T, bool> canExecute)
        {
            if (execute == null)
            {
                throw new ArgumentNullException("execute");
            }

            _execute = execute;
            _canExecute = canExecute;
        }

        public void OnCanExecuteChanged()
        {
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute == null || _canExecute((T)parameter);
        }

        public void Execute(object parameter)
        {
            if (CanExecute(parameter) && _execute != null)
            {
                T param = default(T);
                try
                {
                    param = (T)parameter;
                }
                catch { }

                _execute(param);
            }
        }

        #endregion
    }

我的问题如下:

MainWindow.XAML :

<!-- Working -->
<controls:DragWindowBorder>
       <TextBlock Text="test"/>
</controls:DragWindowBorder>

<!-- Not Working -->
<controls:DragWindowBorder>
       <TextBox Text="test"/>
</controls:DragWindowBorder>

<!-- Not Working -->
<controls:DragWindowBorder>
         <Grid>
               <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
               </Grid.ColumnDefinitions>
         </Grid>
</controls:DragWindowBorder>

出于某种原因,我的 UserControl 在包含某些控件时似乎无法捕获左键单击。

你能帮我弄清楚如何解决这个问题吗?

我设法解决了我的问题。

1 - 对于 TextBox 示例,TextBox 在我的 UserControl 上方,因此它捕获左键单击而不是我的 User 控件。

2 - 对于 Gid 示例,我需要在我的 UserControl 中设置背景:

<UserControl x:Class="Default.Common.Controls.Views.DragWindowBorder"
             ...
             Background="Transparent">

默认情况下,UserControls 没有任何背景,因此如果它们填充了空组件(如我的示例中的空网格列),它们将无法捕获鼠标点击。