私のWPFアプリケーションには、ポップアップウィンドウのように見え、振る舞いますが、ウィンドウではないと思われるUserControl
があります。コントロールがWindow
クラスから降下しないのは、サードパーティの仮想オンスクリーンキーボードが含まれているためで、そのコントロールは、クリックすると入力文字を送信するTextBox
コントロールと同じウィンドウ内になければならないためですそのボタン。キーボードコントロールが同じウィンドウにない場合は、TextBox
コントロールも表示されません。ウィンドウのように画面上でユーザーコントロールをドラッグ可能にする方法
私が抱えている問題は、ダイアログをドラッグするとパフォーマンスが非常に悪いことです。それは、マウスがドラッグ領域から出て、それがマウスに続いて停止するのに十分遅いです。私はより良い方法が必要です。
ここ制御のためのXAMLからの抜粋です:コントロールがそれを使用するウィンドウにCanvas
の内側に配置されなければならないことを
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
Canvas canvas = Parent as Canvas;
if (canvas == null) {
throw new InvalidCastException("The parent of a KeyboardPopup control must be a Canvas.");
}
DraggingControl = true;
CurrentMousePosition = e.GetPosition(canvas);
e.Handled = true;
}
private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
Canvas canvas = Parent as Canvas;
if (canvas == null) {
throw new InvalidCastException("The parent of a KeyboardPopup control must be a Canvas.");
}
if (DraggingControl) {
Point mousePosition = e.GetPosition(canvas);
// Correct the mouse coordinates in case they go off the edges of the control
if (mousePosition.X < 0.0) mousePosition.X = 0.0; else if (mousePosition.X > canvas.ActualWidth) mousePosition.X = canvas.ActualWidth;
if (mousePosition.Y < 0.0) mousePosition.Y = 0.0; else if (mousePosition.Y > canvas.ActualHeight) mousePosition.Y = canvas.ActualHeight;
// Compute the new Left & Top coordinates of the control
Canvas.SetLeft(this, Left += mousePosition.X - CurrentMousePosition.X);
Canvas.SetTop(this, Top += mousePosition.Y - CurrentMousePosition.Y);
}
e.Handled = true;
}
private void Grid_MouseMove(object sender, MouseEventArgs e) {
Canvas canvas = Parent as Canvas;
if (canvas == null) {
// It is not. Throw an exception
throw new InvalidCastException("The parent of a KeyboardPopup control must be a Canvas.");
}
if (DraggingControl && e.LeftButton == MouseButtonState.Pressed) {
Point mousePosition = e.GetPosition(canvas);
// Correct the mouse coordinates in case they go off the edges of the control
if (mousePosition.X < 0.0) mousePosition.X = 0.0; else if (mousePosition.X > canvas.ActualWidth ) mousePosition.X = canvas.ActualWidth;
if (mousePosition.Y < 0.0) mousePosition.Y = 0.0; else if (mousePosition.Y > canvas.ActualHeight) mousePosition.Y = canvas.ActualHeight;
// Compute the new Left & Top coordinates of the control
Canvas.SetLeft(this, Left += mousePosition.X - CurrentMousePosition.X);
Canvas.SetTop (this, Top += mousePosition.Y - CurrentMousePosition.Y);
CurrentMousePosition = mousePosition;
}
e.Handled = true;
}
注:
<Grid Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Border Background="{DynamicResource PopupBackground}"
BorderBrush="{DynamicResource PopupBorder}"
BorderThickness="5,5,5,0"
MouseLeftButtonDown="Grid_MouseLeftButtonDown"
MouseLeftButtonUp="Grid_MouseLeftButtonUp"
MouseMove="Grid_MouseMove">
. . .
</Border>
</Grid>
ここでは、マウスイベントハンドラです。
DragMove
はWindow
クラスのメソッドであるため、このクラスはUserControl
に由来しています。このコントロールのドラッグのパフォーマンスをどのように改善するのですか?私はWin32 APIに頼らなければならないのですか?
http://stackoverflow.com/a/38830033/2507782 –