Czy można łatwo określić margines i / lub wypełnienie dla wierszy lub kolumn w siatce WPF?
Mógłbym oczywiście dodać dodatkowe kolumny, aby oddzielić rzeczy, ale wydaje się, że to zadanie dla dopełnienia / marginesów (da znacznie prostszy XAML). Czy ktoś wyprowadził ze standardowej siatki, aby dodać tę funkcjonalność?
Odpowiedzi:
Możesz napisać własną
GridWithMargin
klasę, dziedziczoną zGrid
i nadpisaćArrangeOverride
metodę, aby zastosować marginesyźródło
RowDefinition
iColumnDefinition
są typuContentElement
iMargin
są ściśleFrameworkElement
własnością. Więc jeśli chodzi o twoje pytanie, „czy to możliwe?” Odpowiedź brzmi zdecydowanie nie. I nie, nie widziałem żadnych paneli układu, które wykazywałyby taką funkcjonalność.Zgodnie z sugestią możesz dodać dodatkowe wiersze lub kolumny. Ale możesz także ustawić marginesy dla
Grid
samego elementu lub wszystkiego, co znajdowałoby się wewnątrz elementu aGrid
, więc na razie jest to najlepsze obejście.źródło
Użyj
Border
kontrolki poza kontrolką komórki i zdefiniuj wypełnienie dla tego:Źródło:
źródło
Możesz użyć czegoś takiego:
Lub jeśli nie potrzebujesz TemplateBindings:
źródło
Pomyślałem, że dodam własne rozwiązanie, ponieważ nikt jeszcze o tym nie wspomniał. Zamiast projektować UserControl w oparciu o Grid, możesz kierować kontrolki zawarte w siatce z deklaracją stylu. Dba o dodanie dopełnienia / marginesu do wszystkich elementów bez konieczności definiowania dla każdego z nich, co jest uciążliwe i pracochłonne.Na przykład, jeśli twoja siatka zawiera tylko TextBlocks, możesz to zrobić:
Co jest odpowiednikiem „wypełniania komórek”.
źródło
Margin
właściwości, chodzi o to, że każdaStyle
z aResourceDictionary
będzie miała zastosowanie do każdego jej elementuTargetType
wszędzie w całym zakresie elementu właściciela tego słownika. Więc to,Style
co się ścieka, a nie własność.Nie jest to strasznie trudne. Nie potrafię powiedzieć, jak trudne było to w 2009 roku, kiedy padło pytanie, ale to było wtedy.
Zwróć uwagę, że jeśli jawnie ustawisz margines bezpośrednio na element podrzędny siatki podczas korzystania z tego rozwiązania, ten margines pojawi się w projektancie, ale nie w czasie wykonywania.
Tę właściwość można zastosować do Grid, StackPanel, WrapPanel, UniformGrid lub dowolnego innego elementu podrzędnego Panel. Wpływa na najbliższe dzieci. Zakłada się, że dzieci będą chciały zarządzać układem własnych treści.
PanelExt.cs
Próbny:
MainWindow.xaml
MainWindow.xaml.cs
źródło
build
lubrun
przed wyświetleniem podglądu na żywo? Dobry i prosty. 1 w górę.Niedawno napotkałem ten problem podczas tworzenia oprogramowania i przyszło mi do głowy zapytać DLACZEGO? Dlaczego to zrobili ... odpowiedź była tuż przede mną. Wiersz danych jest obiektem, więc jeśli zachowamy orientację obiektową, projekt dla określonego wiersza powinien zostać oddzielony (przypuśćmy, że będziesz musiał ponownie użyć wyświetlania wiersza później w przyszłości). Zacząłem więc używać paneli stosu danych i niestandardowych elementów sterujących dla większości wyświetlaczy danych. Sporadycznie pojawiały się listy, ale najczęściej siatka była używana tylko do organizacji strony głównej (nagłówek, obszar menu, obszar zawartości, inne obszary). Twoje obiekty niestandardowe mogą z łatwością zarządzać dowolnymi wymaganiami dotyczącymi odstępów dla każdego wiersza w panelu stosu lub siatce (pojedyncza komórka siatki może zawierać cały obiekt wiersza. Dodatkową zaletą jest prawidłowe reagowanie na zmiany orientacji,
lub
Twoje niestandardowe kontrolki odziedziczą również DataContext, jeśli używasz powiązania danych ... moja ulubiona korzyść z tego podejścia.
źródło
ListView
formantu WPF wGridView
trybie, ale bez przepisu na to, aby wszystkie „RowObjects” miały tę samą szerokość kolumny. W rzeczywistości nie ma to już wiele wspólnego z siatką.na platformie UWP (wersja Windows10FallCreatorsUpdate i nowsze)
źródło
Xamarin.Forms
.Edytowano:
Aby nadać margines dowolnej kontroli, można ją owinąć obramowaniem w ten sposób
źródło
Zrobiłem to teraz z jedną z moich siatek.
źródło
Jedną z możliwości byłoby dodanie wierszy i kolumn o stałej szerokości, które pełnią rolę dopełnienia / marginesu, którego szukasz.
Możesz również wziąć pod uwagę, że jesteś ograniczony rozmiarem kontenera i że siatka stanie się tak duża, jak element zawierający lub określoną szerokość i wysokość. Możesz po prostu użyć kolumn i wierszy bez ustawionej szerokości ani wysokości. W ten sposób domyślnie równomiernie dzielą całkowitą przestrzeń w siatce. Wtedy wystarczyłoby wyśrodkować elementy w pionie i poziomie w obrębie siatki.
Inną metodą może być zawinięcie wszystkich elementów siatki w ustaloną siatkę z jednym wierszem i kolumną, która ma stały rozmiar i marginesy. Twoja siatka zawiera pola o stałej szerokości / wysokości, które zawierają Twoje rzeczywiste elementy.
źródło
Miałem ostatnio podobny problem w siatce dwóch kolumn, potrzebowałem marginesu na elementach tylko w prawej kolumnie. Wszystkie elementy w obu kolumnach były typu TextBlock.
źródło
Chociaż nie możesz dodać marginesu lub wypełnienia do siatki, możesz użyć czegoś takiego jak Frame (lub podobnego kontenera), do którego możesz go zastosować.
W ten sposób (jeśli pokażesz lub ukryjesz kontrolkę po kliknięciu przycisku, powiedz), nie będziesz musiał dodawać marginesu do każdej kontrolki, która może z nią współdziałać.
Pomyśl o tym jak o wyodrębnieniu grup kontrolek w jednostki, a następnie zastosowaniu stylu do tych jednostek.
źródło
Jak wspomniano wcześniej, utwórz klasę GridWithMargins. Oto mój działający przykład kodu
Stosowanie:
źródło
Dziwię się, że jeszcze nie widziałem tego rozwiązania.
Pochodzące z sieci frameworki takie jak bootstrap będą używać ujemnego marginesu do wycofywania wierszy / kolumn.
Może być trochę gadatliwy (choć nie taki zły), działa, a elementy są równomiernie rozmieszczone i dopasowane.
W poniższym przykładzie używam
StackPanel
korzenia, aby zademonstrować, jak 3 przyciski są równomiernie rozmieszczone przy użyciu marginesów. Możesz użyć innych elementów, po prostu zmień wewnętrzny x: Type z przycisku na swój element.Pomysł jest prosty, użyj siatki na zewnątrz, aby wyciągnąć marginesy elementów poza ich granice o połowę wielkości siatki wewnętrznej (używając marginesów ujemnych), użyj siatki wewnętrznej, aby równomiernie rozmieścić elementy w żądanej ilości.
Aktualizacja: jakiś komentarz od użytkownika powiedział, że to nie działa, oto krótki film demonstrujący: https://youtu.be/rPx2OdtSOYI
źródło
Czasami prosta metoda jest najlepsza. Po prostu dopełnij struny spacjami. Jeśli jest to tylko kilka pól tekstowych itp., Jest to zdecydowanie najprostsza metoda.
Możesz także po prostu wstawić puste kolumny / wiersze o stałym rozmiarze. Niezwykle proste i możesz je łatwo zmienić.
źródło