2011-07-15 18 views

Odpowiedz

11

Można wykonać wiersze zmieniające rozmiar, ale sam GridSplitter jest kciukiem i ma własne zdarzenia, takie jak DragStarted i DragCompleted. Więcej szczegółów here.

Edit: Jeśli uczynić GridSplitter aktywowana i pozwolić mu zostać przeniesione z klawiatury, przeczytaj odpowiedź od Benlitz aby uzyskać więcej informacji.

+0

Przeczytaj to, nawet jeśli nie martwisz się klawiaturą, ponieważ jest to powszechny błąd w projektowaniu obsługi niewłaściwego zdarzenia (jedno z działań wejściowych, zamiast ogólnego wyniku działania). – Benlitz

+0

Następnie opracuj :) I Ciekaw jestem, dlaczego preferowałbyś nierozszerzalną metodę opartą na pojedynczym działaniu użytkownika, zajmującą się odpowiednią zmianą właściwości, podczas gdy oba mają ten sam koszt wdrożenia. Załóżmy, że po zaimplementowaniu tego, zostaniesz poproszony o dodanie przycisku, który przywróci domyślny rozmiar wiersza. Zmiana programowo programu nie byłaby możliwa. Dlatego uważam, że takie podejście nie jest dobre; może łatwo wprowadzić błędne błędy w twoim interfejsie. Jeśli operacja wykonywana przez program obsługi zmiany rozmiaru wiersza nie jest wyraźnie widoczna, może nawet nie zauważyć problemu przez kilka tygodni. – Benlitz

+0

Jako przykład, reagowanie na kciuk DragDelta zamiast zmiany rozmiaru ma znacznie inny efekt animacji - sprawdź za pomocą Snoop i zobacz, jak różne są komunikaty różnicowe. Wreszcie, o ile klawiatura nie może być użyta do zmiany rozmiaru GridSplitter (focusable = false), to i tak jest to punkt sporny. –

6

Nie testowałem, ale jestem całkiem pewny, że aktualnie zaakceptowana odpowiedź z AresAvatar nie zadziała, jeśli zmieniasz rozmiar wierszy/kolumn za pomocą strzałek na klawiaturze (przez skupienie się na rozdzielaczu siatki). Jest to rzadki, ale możliwy przypadek, który należy przewidzieć w swoim wniosku.

kiedy rozdzielacz siatka jest przesuwana (przez drag'n'drop lub za pomocą klawiszy strzałek), zmienia Width/Height właściwości zależność ColumnDefinition/RowDefinition siatki. Możesz łatwo zarejestrować obsługi na tej zmianie własności:

var heightDescriptor = DependencyPropertyDescriptor.FromProperty(RowDefinition.HeightProperty, typeof(ItemsControl)); 
heightDescriptor.AddValueChanged(myGrid.RowDefinition[0], HeightChanged); 

(Spowoduje to urywek na zmianę rozmiaru instancji toru w pierwszym rzędzie na starcie).

Następnie można obsłużyć zmianę rozmiaru w programie obsługi, który będzie działał w każdym przypadku.

private void HeightChanged(object sender, EventArgs e) 
{ 
    // TODO: handle row resize 
} 

Generalnie, to naprawdę nie powinni polegać na działaniu wejściowej użytkownika (wodzącego mysz, klawiatura wejść ...) do obsługi logiczne lub wizualnych działań/wydarzenia, ponieważ tam są prawie zawsze zrobić na kilka sposobów te same czynności przy użyciu różnych danych wejściowych (myszy, klawiatury, ekran dotykowy, łatwość obsługi narzędzi ...).

+0

Witam @ Berlitz, ta odpowiedź nie ma większego sensu. Jeśli zezwolisz, aby GridSplitter dostał fokus na klawiaturze, działa tak, jak powinien. –

+0

Ma to sens. Jeśli chcesz obsłużyć zdarzenie "Rozdzielacz siatki jest przenoszony" (pytanie OP), NIE powinieneś obsługiwać DragStarted/Completed, ponieważ zakłada, że ​​przeciąganie myszą jest jedynym sposobem na przesunięcie splittera, co jest błędne. Samo podejście jest błędne, ponieważ radzisz sobie z jedną z możliwych przyczyn (przeciąganiem), zamiast radzić sobie z konsekwencją (splitter został przeniesiony). Ilustracja, którą dałem, aby udowodnić, że mój punkt jest taki, że przesuwanie splittera za pomocą strzałek na klawiaturze nie wywoła zdarzeń przeciągania (testowałem to teraz). – Benlitz

+0

OK, teraz lepiej rozumiem twoją odpowiedź z twoim komentarzem. Jeśli zmusisz GridSplitter do ustawienia ostrości i pozwolisz na ruchy klawiatury, nie generuje on zdarzeń przeciągania. Dodałem notatkę do mojej odpowiedzi, aby przeczytać twoje. –

Powiązane problemy