Wymuś zmianę rozmiaru kontrolki niestandardowej WPF


Napisałem niestandardową kontrolkę WPF, a jej część obejmuje dynamiczne dodawanie elementów do kanwy, które wpływają na wysokość określonej kanwy. Kanwa jest zagnieżdżona w siatce. Kiedy dynamicznie dodaję elementy, wysokość obszaru roboczego zmienia się, ale obszar roboczy ostatecznie wychodzi poza krawędź współdzielonej kontrolki, zamiast powodować zmianę rozmiaru i zwiększenie jej rozmiaru.
Jak mogę uzyskać kontrolę, aby poprawnie zmienić rozmiar?
Mam wrażenie, że muszę wywołać lub zastąpić metodę Measure lub Arrangement, ale nie mam szczęścia z żadną z tych metod - być może dlatego, że wywołuję je z niewłaściwymi parametrami, a może dlatego, że nie są to właściwe metody do wywołania.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twoim problemem jest to, że panele płótna nie zmieniają rozmiaru, aby pasowały do ​​ich zawartości.
Chciałeś mierzyć i organizować. Czy znasz dwuprzebiegowy system układu WPF? Przeczytaj ten artykuł, aby uzyskać więcej informacji:

układ układu
http://msdn.microsoft.com/en-u ... .aspx
WPF .
W tym artykule opisano również, jak poszczególne panele wpływają na układ. Każdy typ panelu jest inny.
W WPF elementy mają najpierw możliwość określenia, jak duże będą. Panele mogą dostosować swój rozmiar do rozmiaru ich dzieci lub mogą poprosić o stały rozmiar niezależnie od rozmiaru ich dzieci. Przykładem tego ostatniego jest płótno.
Następnie elementom mówi się, jakiego będą rozmiaru, i prosi się o ułożenie siebie i swoich dzieci.
Typ panelu siatki nie tylko pozwala używać wierszy i kolumn, ale także bardzo dobrze nadaje się do automatycznego zmiany rozmiaru treści.
Typ StackPanel nie jest w ogóle dopasowywany automatycznie w wymiarze, w którym jest zorientowany, ale będzie automatycznie wymiarowany w innym wymiarze.
Płótno może automatycznie zmieniać rozmiar, aby wypełnić przestrzeń, ale nigdy nie pozwala na automatyczną zmianę rozmiaru dzieci. Rysuje swoje dzieci według podanych współrzędnych i nie obchodzi go, jak duże są.
Sugerowałbym wypróbowanie siatki z tylko jednym wierszem/kolumną.
Możesz też utworzyć nową klasę Canvas, która ma lepsze możliwości automatycznej zmiany rozmiaru. Podczas pomiaru będziesz musiał zmierzyć dzieci i odpowiednio zmienić rozmiar płótna. W przyszłości może Ci się przydać taka klasa.
Oto artykuł na temat

układ automatyczny
http://msdn.microsoft.com/en-u ... .aspx
w WPF.
Jeśli chcesz utworzyć panel niestandardowy, oto jego podtematem:

niestandardowe elementy panelu
http://msdn.microsoft.com/en-u ... ments
.
EDIT:
Jeszcze jedno: możesz również powiązać szerokość/wysokość dziecka z właściwościami ActualWidth i ActualHeight na płótnie, aby dziecko dostosowywało rozmiar swojego rodzica. W razie potrzeby możesz użyć konwertera, aby ustawić współczynnik kształtu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

czy próbowałeś zawinąć wszystko (zawartość niestandardowej kontroli) w polu widoku?
dawny.
<UserControl>
<Border BorderBrush="Black" BorderThickness="1">
<Viewbox>
<Grid>
<TextBlock Name="txtDefault" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" Foreground="Black" Opacity="0.5" Text="Default"/>
<TextBlock Name="txtValue" FontSize="16" Foreground="Black" Visibility="Collapsed"/>
<TextBlock Name="txtKey" Grid.Column="1" FontSize="18" Foreground="Black" Visibility="Collapsed"/>
</Grid>
</Viewbox>
</Border>
</UserControl>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Musisz nadpisać metodę MeasureOverride kontrolki i stamtąd zwrócić żądany rozmiar (rozmiar płótna). Formant nadrzędny zmieni wtedy swój rozmiar, aby dostosować się do swojego elementu podrzędnego (jeśli to możliwe).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć UniFormGrid, aby to zarchiwizować. Ustaw kolumny lub wiersze na 1, aby uzyskać elementy ułożone pionowo/poziomo
<UniformGrid Columns="1">
<Button Content="Content 1"/>
<Button Content="Content 2"/>
<Button Content="Content 3"/>
</UniformGrid>

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się