Перемещение окна WPF мышкой
Значит, нашёл я как перемещать мышкой WinForms окно, а как WPF не нашёл
Окно полностью состоит из своих элементов, а двигать хочется за лейбл(так скажем "шапка")
Может кто-то знает?
код:
private void headlbl_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (isMouseDown)
{
this.Margin = new Thickness(System.Windows.Forms.Control.MousePosition.X, System.Windows.Forms.Control.MousePosition.Y, 0, 0);
}
}
private void headlbl_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isMouseDown = true;
}
private void headlbl_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isMouseDown = false;
}
Ответы (1 шт):
В вашем вопросе есть ряд ошибок, которые я советую вам исправить сразу.
Label- в WPF проекте это не очень хороший контрол для вывода текста. Дело тут в том, чтоLabel, этоContentControl, то есть элемент, который предназначен для вывода всего, даже если это не является текстом (например,<Label><Button Content = "Привет мир!"/></Label>). Зачастую эта "перегруженность" бывает лишней, ведь нам нужно лишь вывести текст. Поэтому, советую забыть проLabelи использоватьTextBlock, который предназначен именно для текста.this.Margin- я надеюсь вы не используете такое в WPF? Если используете, то это очень плохо, ведь в WPF проекте есть 2 базовые вещи, на котором стоится весь проект, а именноXAMLиBinding, и если вы ими пренебрегаете, то смысл вообще в WPF? Не используйте контролы в коде, создавайте их в XAML, делайте им нужное поведение и стили там! Также не используйте контролы как источник данных (tb.Text = "Привет мир!"), это повлечет за собой много проблем в дальнейшем (включая производительность), лучше задайте окнуDataContextна некий класс, в котором будет простое свойство (public string Text { get; set; }) и в XAML привяжите его (<TextBlock Text = "{Binding Text}"/>), все, вы отвязали данные от контролов, теперь просто работайте со свойствами и классами, не затрагивая UI.
Теперь про перетаскивание
Если вам надо перетаскивать окно зажатием мыши по конкретному элементу (что странно), то для этого у окна есть специальный метод,
DragMove(), который достаточно вызвать при вызове событияMouseDownконтрола. То есть, самое элементарное, этоXAML:
<Label MouseDown="Label_MouseDown" Content="Привет мир!"/>C#:
private void Label_MouseDown(object sender, MouseButtonEventArgs e) => DragMove();Все, теперь при зажатии мыши на
Labelу вас будет двигаться окно.Если вы делаете "шапку", то значит вам надо просто вернуть стандартное поведение, а не вешать события на контролы. Для этого, достаточно окну задать
WindowChromeXAML:
<Window ....> <WindowChrome.WindowChrome> <WindowChrome/> </WindowChrome.WindowChrome> </Window>Все, у вашего окна полностью восстановлено стандартное поведение "шапки", включая перетаскивание, меню на ПКМ, растягивание и прочее. Все размеры и др. можете настроить самостоятельно у объекта
<WindowChrome/>. У вас кстати может возникнуть одна проблема - не проходит клик по объекту (к примеру кнопка), которая находится в области хрома. Решение простое: задатьWindowChrome.IsHitTestVisibleInChrome="True". Пример этого всего можете глянуть тут.
Вообще, "кастомное" окно, это весьма сложная вещь, там сложно сделать все правильно, везде есть свои "НО". Я уверен, что сейчас вы сделали WindowStyle="None" AllowsTransparency="True", поверх накидали контролов и радуетесь. Ок, в чем недостаток? А в том, что вы потеряли при таком подходе к примеру анимацию сворачивания окна, которую делает Windows. Решением будет такой подход, который тоже не без греха.
Короче, предоставил вам вроде все необходимое, дерзайте)