これは本当に誰かがこの動作についてより良い説明をしていない限り、私には奇妙なバグのように見えます。
ScrollViewer
(PART_ContentHost)は、内部のようなTemplate
を使用しています:面白いビットが
<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>
:今
<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}" />
0にあなたがちょうどそこにマージンを設定することができ、あなたの問題を解決する代わりに、 {TemplateBinding Padding}
あなたはあなたの希望する出力を得るでしょう。
しかし、なぜそれを行う必要がありましたか?
TemplateBinding Padding
は、[OK]をそれは奇妙だが、何より悪いのですがある内側の範囲にあり、15
である親(Button
)から継承されたパディング値を選ぶScrollViewer
上で直接設定された値を無視しているように見えますそれはパディングのためだけです。 Foreground
,Background
,Margin
は、ScrollViewer
に直接設定するとすべて問題なく、TextBox
のフィールドより優先されます。私はさらに、Padding
をデフォルトのスタイル設定ツールTextBox
に直接セットして、いくつかの優先順位のケースが問題かどうかを確認しました。
そうではありませんでした。同じ出力を得ました。
パディングはSystem.Windows.Controls.Control
で定義されています。これは同じクラスのフォアグラウンドで、背景はScrollViewer
から継承しています。なぜパディングのみが異なる動作をしているのか分かりません。
私も
<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}" />
また、印刷の15,15,15,15のようなものにプレゼンターを変更してみました。 Margin
の場合は実行しません。
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollViewer}}, Path=Padding}
結合と同じ効果。
ScrollViewer
は、子にそれに設定されたプロパティを渡さないという1つの投稿を見ました。それが実際の場合は、Background
、Margin
、どのようにオーバーライドしたのですか?何が特別なPadding
についての特別な?それが有効な振る舞いであれば、テンプレートなしでその振る舞いを取り除く方法は実際にはわかりません。これは、複雑な実装の1つで、ScrollViewer
です。
詳細とよくテストされた回答をいただきありがとうございます!私はscrollviewerテンプレートに関する情報と情報を本当に感謝しています。これは確かに奇妙なケースですが、それは私にはあまり意味がありません。 –