我设计了一个 Window Style=None 的 WPF 表单。所以我看不到表单中的拖动条。如何使用 WindowStyle=None 属性移动表单?
5 回答
我正在使用一个主窗口来保存页面(创建一个导航样式程序),并且在我的主窗口后面的代码中,我插入了这个......
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
// Begin dragging the window
this.DragMove();
}
...它就像一个魅力。这是windowstyle=none。从某种意义上说,它很好,您可以单击应用程序上的任意位置并移动它,而不仅仅是局限于顶部栏。
看到这个问题。
基本上,您为此使用Window.DragMove方法。
在我们的应用程序中,我们将 WindowStyle 设置为“none”的 Windows,我们实现了拖动 Window 的功能,但仅从标题而不是从 Window 中的任何点拖动。我们通过添加一个边框作为标题来做到这一点,然后添加一个拇指来填充整个边框。然后,我们在 Window 的代码隐藏中处理 Thumb 上的 DragDelta 方法。
<Border
Name="headerBorder"
Width="Auto"
Height="50"
VerticalAlignment="Top"
CornerRadius="5,5,0,0"
DockPanel.Dock="Top"
Background="{StaticResource BackgroundBrush}"
BorderThickness="1,1,1,1"
BorderBrush="{StaticResource BorderBrush}">
<Grid>
<Thumb
x:Name="headerThumb"
Opacity="0"
Background="{x:Null}"
Foreground="{x:Null}"
DragDelta="headerThumb_DragDelta"/>
</Grid>
</Border>
然后在代码隐藏中,我们有以下事件处理程序......
private void headerThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
Left = Left + e.HorizontalChange;
Top = Top + e.VerticalChange;
}
我不知道这是否比其他方法更好,这就是我们这样做的方式。
在加载函数的窗口内或在网格的加载函数内,使用 deligate 在鼠标单击时触发 DragMove() 方法
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
this.MouseLeftButtonDown += delegate{DragMove();};
}
如果您只是添加this.DragMove();
并且正在使用 Bing 地图,那么在尝试平移地图时会遇到一些令人沮丧的行为。
使用TabbyCool 的答案是一个很好的解决方案,但是,您不能将窗口拖到屏幕顶部以使其最大化。
我的解决方案只是检查我的点击相对于我的顶部条形网格的 position.Y 是否小于合适的数量。
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonDown(e);
Point pt = e.GetPosition(topBar);
Debug.WriteLine(pt.Y);
if (pt.Y < topBar.ActualHeight)
{
DragMove();
}
}