我有一个弹出窗口,StaysOpen=False所以我想通过点击弹出窗口外的任何地方来关闭它.在弹出窗口我有一个DataGrid.如果我打开弹出窗口然后单击其他位置,弹出窗口将被关闭.但是如果在点击弹出窗口之前我将点击列标题,就不会发生这种情况DataGrid.测试XAML:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black">
<Grid>
<ToggleButton x:Name="btn" VerticalAlignment="Top">Open</ToggleButton>
<Popup StaysOpen="False" IsOpen="{Binding IsChecked, ElementName=btn}" >
<DataGrid Width="150" Height="150">
<DataGrid.Columns>
<DataGridTextColumn Header="Column" />
</DataGrid.Columns>
</DataGrid>
</Popup>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
我认为这是因为列标题在点击时捕获鼠标并且弹出窗口不再接收鼠标事件.我试图在LostMouseCapture事件上添加一个处理程序,以便通过弹出窗口捕获鼠标,但它似乎并不那么容易.有任何想法吗?
我创建了一个usercontrol,其中包含Canvas和Canvas上的Button.为了能够在画布上移动按钮,我附加了一个如下所示的DragBehavior:
class DragOverCanvasBehavior : Behavior<FrameworkElement>
{
private Point _mouseStartPosition;
protected override void OnAttached()
{
AssociatedObject.MouseLeftButtonDown += (sender, e) =>
{
_mouseStartPosition = e.GetPosition((Canvas) AssociatedObject.Parent);
AssociatedObject.CaptureMouse();
};
AssociatedObject.MouseLeftButtonUp += (sender, e) => AssociatedObject.ReleaseMouseCapture();
AssociatedObject.MouseMove += (sender, e) =>
{
var point = e.GetPosition((Canvas)AssociatedObject.Parent) - _mouseStartPosition;
if (AssociatedObject.IsMouseCaptured)
{
Canvas.SetTop(AssociatedObject, point.Y);
Canvas.SetLeft(AssociatedObject, point.X);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
出于商业原因,如果我按住并拖动画布,我也需要移动画布.我使用类似的Behavior类来改变Canvas边距并给它看起来好像它在拖动时随鼠标指针移动一样.此行为还捕获鼠标.
现在的问题是 - 如果我单击并拖动按钮,Canvas也会获取鼠标事件并开始被拖动.如何确保在拖动Button时Canvas Behavior不会获得鼠标事件.
我尝试在行为中放置e.Handled = true,但这不起作用.
如果我发现鼠标已经被捕获了一些其他对象,我可以在行为中设置条件,以便不再捕获它.
我有一个非常复杂的视图,在选项卡控件中有多个选项卡.在一个选项卡上有一个带有装饰层的控件.Adorner层在MouseLeftButtonDown事件处理程序中调用CaptureMouse来捕获鼠标输入.一切正常.
但是,如果我按特定顺序切换视图上的选项卡然后单击adorner图层则无法捕获鼠标输入:CaptureMouse()返回false.同时Mouse.Captured返回null.托管装配层的控件继续正常工作,甚至能够捕获鼠标.
无法提供任何代码,因为有许多自定义控件在运行.在简化的布局中,一切正常.
任何有关CaptureMouse失败的建议?