Подтвердить что ты не робот

Дважды щелкните событие на границе окна WPF.

Есть ли какое-либо событие, которое срабатывает при двойном щелчке на границе окна WPF?

Как я могу его поймать?

Спасибо!

4b9b3361

Ответ 1

Вот один из способов. Просто установите для Window.WindowStyle значение "Нет" и создайте нижнюю границу окна:

<Grid>
    <Border 
        BorderBrush="Silver"  
        BorderThickness="10" 
        Name="border1" 
        MouseLeftButtonDown="border1_MouseLeftButtonDown" />
</Grid>

В коде позади:

private void border1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 2)
       MessageBox.Show("Double Click");
}

Ответ 2

Извините за опоздание на вечеринку, но я хотел бы предложить вам, чтобы вам было лучше с первым ответом (от Jaster) до Почему пограничный контроль WPF не имеет событие mousedoubleclick?.

Он стал более чистым и даже не использовал одну строчку кода, поэтому он полностью совместим с MVVM и должен быть вашим путем.

<Window x:Class="Yoda.Frontend.MainView" x:Name="MainViewWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Border>
    <Border.InputBindings>
      <MouseBinding MouseAction="LeftDoubleClick"
                    Command="{Binding YourBindableCommand}"
                    CommandParameter="{Binding}" />
    </Border.InputBindings>
  </Border>
</Window>

Примечание.. Конечно, вам нужно заменить YourBindableCommand на соответствующую команду, возможно, предоставленную ViewModel. Если вам нужна помощь в этом, просто дайте мне знать.

Ответ 3

using System.Windows.Input;
using System.Windows.Threading;
  namespace System.Windows.Controls{
    class DCCanvas : Canvas{

        public event MouseButtonEventHandler MouseDoubleClick;
        private bool doubleClickStarted;
        private DispatcherTimer doubleClickTimer;
        private const long DOUBLE_CLICK_INTERVAL = 2000000;

        public DCCanvas() : base(){    
            doubleClickStarted = false;
            doubleClickTimer = new DispatcherTimer();
            doubleClickTimer.Interval = new TimeSpan(DOUBLE_CLICK_INTERVAL);
            doubleClickTimer.Tick += new EventHandler(doubleClickTimer_Tick);
            MouseUp += new MouseButtonEventHandler(mouseUpReaction);
        }

        private void mouseUpReaction(object sender, MouseButtonEventArgs e){
            if(doubleClickStarted) { 
                doubleClickStarted =false; 
                if(MouseDoubleClick!=null)
                    MouseDoubleClick(sender, e);
            }
            else{ 
                doubleClickStarted =true;
                doubleClickTimer.Start();               
            }
        }
        private void doubleClickTimer_Tick(object sender, EventArgs e){
            doubleClickStarted = false; doubleClickTimer.Stop();
        }
    }
}

Здесь выше мой класс Canvas. Вы можете использовать его, чтобы упростить обработку двойных кликов на вашем холсте. Он будет срабатывать каждый второй mouseUp в указанном интервале (const DOUBLE_CLICK_INTERVAL в коде). Кажется мне не очень сложно использовать:

public partial class MainWindow : Window
{
    DCCanvas rusCanvas1;

    public MainWindow(){
        InitializeComponent();

            rusCanvas1 = new DCCanvas();
            /* Some code with properties for new rusCanvas */
            this.grid1.Children.Add(rusCanvas1);
            rusCanvas1.MouseDoubleClick += new MouseButtonEventHandler(canvas1_doubleClick);
    }
    private void canvas1_doubleClick(object sender, MouseButtonEventArgs e) { 
        MessageBox.Show(sender.ToString());
    }
}

Если вы не хотите писать свойства для Canvas, вы можете добавить в класс конструктор-скопир:

public DCCanvas(Canvas source) : base(){
        Margin = source.Margin;
        Style = source.Style;
        Height = source.Height;
        Width = source.Width;
        Background = source.Background;
        VerticalAlignment = source.VerticalAlignment;
        HorizontalAlignment = source.HorizontalAlignment;


        doubleClickStarted = false;
        doubleClickTimer = new DispatcherTimer();
        doubleClickTimer.Interval = new TimeSpan(DOUBLE_CLICK_INTERVAL);
        doubleClickTimer.Tick += new EventHandler(doubleClickTimer_Tick);
        MouseUp += new MouseButtonEventHandler(mouseUpReaction);
    }

Oky, теперь вы можете создать свой холст в визуальном редакторе, а затем написать вот так:

            rusCanvas1 = new DCCanvas(c1); 
// "c1" is a name of your pre-created standard Canvas.
            this.grid1.Children.Add(rusCanvas1);
            this.grid1.Children.Remove(c1);

Просто скопируйте его и удалите старый.

Я написал этот класс, так как хочу, чтобы эта функция была доступна в качестве стандартного. Я имею в виду, Canvas (и все другие элементы управления и объекты!) Должны иметь возможность обрабатывать двойные клики на нем без дополнительного кодирования...