要拖动的 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
}
我的问题如下:
- 当我调用包含 TextBlock 的 UserControl 时,拖动工作正常
- 例如,当我调用包含 TextBox 或 Grid 的 UserControl 时,拖动不起作用
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 没有任何背景,因此如果它们填充了空组件(如我的示例中的空网格列),它们将无法捕获鼠标点击。
我正在尝试制作一个容器 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
}
我的问题如下:
- 当我调用包含 TextBlock 的 UserControl 时,拖动工作正常
- 例如,当我调用包含 TextBox 或 Grid 的 UserControl 时,拖动不起作用
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 没有任何背景,因此如果它们填充了空组件(如我的示例中的空网格列),它们将无法捕获鼠标点击。