To naprawdę wygląda na dziwny błąd, chyba że ktoś ma lepsze wytłumaczenie tego zachowania.
ScrollViewer
(PART_ContentHost) wykorzystuje wewnętrznie Template
jak:
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid x:Name="Grid"
Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Rectangle x:Name="Corner"
Grid.Row="1"
Grid.Column="1"
Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter"
Grid.Row="0"
Grid.Column="0"
Margin="{TemplateBinding Padding}"
CanContentScroll="{TemplateBinding CanContentScroll}"
CanHorizontallyScroll="False"
CanVerticallyScroll="False"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
<ScrollBar x:Name="PART_VerticalScrollBar"
Grid.Row="0"
Grid.Column="1"
AutomationProperties.AutomationId="VerticalScrollBar"
Cursor="Arrow"
Maximum="{TemplateBinding ScrollableHeight}"
Minimum="0"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
Value="{Binding VerticalOffset,
Mode=OneWay,
RelativeSource={RelativeSource TemplatedParent}}" />
<ScrollBar x:Name="PART_HorizontalScrollBar"
Grid.Row="1"
Grid.Column="0"
AutomationProperties.AutomationId="HorizontalScrollBar"
Cursor="Arrow"
Maximum="{TemplateBinding ScrollableWidth}"
Minimum="0"
Orientation="Horizontal"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
Value="{Binding HorizontalOffset,
Mode=OneWay,
RelativeSource={RelativeSource TemplatedParent}}" />
</Grid>
</ControlTemplate>
Interesującą bit jest:
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter"
Grid.Row="0"
Grid.Column="0"
Margin="{TemplateBinding Padding}"
CanContentScroll="{TemplateBinding CanContentScroll}"
CanHorizontallyScroll="False"
CanVerticallyScroll="False"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
teraz, aby rozwiązać swój problem można po prostu ustawić margines tam 0 zamiast {TemplateBinding Padding}
, a otrzymasz żądany wynik.
Ale dlaczego musieliśmy to zrobić?
TemplateBinding Padding
wydaje się być ignorowanie wartości ustawionej bezpośrednio nad ScrollViewer
który jest w zakresie wewnętrznego i podnosi wartość Dodat odziedziczone od rodzica (Button
), który jest 15.
Ok to dziwne, ale co gorsza to tylko do Padding. Foreground
, Background
, Margin
są w porządku po ustawieniu bezpośrednio na ScrollViewer
zastępują one pola TextBox
. Potwierdziłem nawet przeniesienie zestawu Padding
bezpośrednio do urządzenia TextBox
do domyślnego ustawiacza stylów, aby sprawdzić, czy problem dotyczy jakiegoś precedensu.
Wyglądało na to, że tak nie jest. Mam takie same wyniki.
Wypełnienie jest zdefiniowane w System.Windows.Controls.Control
, który jest tą samą klasą, Pierwszy plan i tło pochodzą z tego ScrollViewer
dziedziczenia. Nie wiem, dlaczego samo podszycie zachowuje się inaczej.
Próbowałem też zmiany prezentera coś jak
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter"
Grid.Row="0"
Grid.Column="0"
Margin="{TemplateBinding Margin}"
CanContentScroll="{TemplateBinding CanContentScroll}"
CanHorizontallyScroll="False"
CanVerticallyScroll="False"
Content="{TemplateBinding Padding}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
To druku 15,15,15,15. Nie robi tego dla Margin
.
Ten sam efekt z wiązaniem {Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollViewer}}, Path=Padding}
.
Widziałem jeden wpis z informacją, że ScrollViewer
nie przekazuje właściwości ustawionych na nim do jego dzieci.Naprawdę nie rozumiem, skoro tak było, jak mogłem pokonać przeszkody? Co tak specjalnego o Padding
? Jeśli jest to prawidłowe zachowanie, tak naprawdę nie widzę sposobu, aby pozbyć się tego zachowania, także bez szablonów ScrollViewer
i jest to jedna myląca implementacja.
Dziękuję bardzo za szczegółową i dobrze przetestowaną odpowiedź! Naprawdę doceniam dane wejściowe i informacje dotyczące szablonu scrollviewer. Jest to z pewnością dziwny przypadek, który nie ma dla mnie większego sensu. –