Czy zdarzenie wywołane zdarzeniem podwójnego kliknięcia w oknie okna WPF jest uruchamiane?Podwójne kliknięcie zdarzenia na ramce okna WPF
Jak mogę to złapać?
Dzięki!
Czy zdarzenie wywołane zdarzeniem podwójnego kliknięcia w oknie okna WPF jest uruchamiane?Podwójne kliknięcie zdarzenia na ramce okna WPF
Jak mogę to złapać?
Dzięki!
Oto jeden sposób .. Wystarczy ustawić Window.WindowStyle na "None" i utworzyć w dół okna border:
<Grid>
<Border
BorderBrush="Silver"
BorderThickness="10"
Name="border1"
MouseLeftButtonDown="border1_MouseLeftButtonDown" />
</Grid>
W kodzie za:
private void border1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 2)
MessageBox.Show("Double Click");
}
Dzięki! Ale mówię o rodzimej granicy okna ... i sugerujesz użycie kontroli granicznej WPF ... – Terminador
Zasugerowałem, że jednym ze sposobów ataku było narysowanie własnej granicy, wtedy miałbyś pełną kontrolę nad wydarzeniami. – RQDQ
Ahhh Więc tak, to może być rozwiązanie. Dziękuję Ci! – Terminador
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();
}
}
}
Tutaj powyżej to moja klasa Canvas. Możesz go użyć, aby ułatwić obsługę podwójnych kliknięć Twojego płótna. Będzie uruchamiał się przy każdym drugim uruchomieniu myszy w określonym przedziale czasu (const DOUBLE_CLICK_INTERVAL w kodzie). Wydaje mi nie bardzo trudne do wykorzystania:
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());
}
}
Jeśli nie chcesz pisać właściwości na płótnie, można dodać konstruktora-copyer do klasy:
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, teraz można tworzyć swoje płótna w edytorze wizualnym, a następnie napisać tak:
rusCanvas1 = new DCCanvas(c1);
// "c1" is a name of your pre-created standard Canvas.
this.grid1.Children.Add(rusCanvas1);
this.grid1.Children.Remove(c1);
Wystarczy go skopiować i usunąć starą.
Napisałem tę klasę, ponieważ chcę, aby ta funkcja była dostępna jako standard. Mam na myśli, że Canvas (i wszystkie inne kontrolki i obiekty!) Muszą obsługiwać podwójne kliknięcia bez dodatkowego kodowania ...
Przepraszamy za spóźnienie na imprezę, ale chciałbym zasugerować, że " lepiej z pierwszą odpowiedzią (przez Jastera) na Why doesnt WPF border control have a mousedoubleclick event?.
Jest o wiele bardziej przejrzysty i nie używa nawet jednej linii kodu, dlatego jest w pełni zgodny z MVVM i powinien być na najlepszej drodze.
<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>
Uwaga: Oczywiście, trzeba zastąpić YourBindableCommand
z odpowiedniego polecenia, prawdopodobnie dostarczony przez ViewModel. Jeśli potrzebujesz pomocy, daj mi znać.
Dla tych, którzy odrzucili moją poprawioną odpowiedź: proszę albo przekazać informację zwrotną na temat tego, co (nadal) nie jest wystarczająco wzmocnione, albo usunąć -1. Wszystko inne jest po prostu bezużyteczne, ponieważ nikomu nie pomoże. – Yoda
Może to pomoże - http://stackoverflow.com/questions/3410768/why-doesnt-wpf-border-control-have-a-ououououbleclick-event –
@BaliC Przepraszamy, nie rozumiem, jak mogę zrobić to dla prostego okna WPF? – Terminador
Masz na myśli podwójne kliknięcie na oknie chrome? To samo podwójne kliknięcie, które powoduje zmaksymalizowanie/zminimalizowanie okna? – ppiotrowicz