4

私は .NET/C#/WPF/XAML に比較的慣れていません。スタイルに影響を与える最も単純なプロパティがコントロールに「欠けている」ように見える場合があることに気付きました。そのため、クラスStyleを使用してコントロールのルック アンド フィールを変更する必要があります。これは問題ありませんが、変更する特定の属性の名前を見つけるために、Google/StackOverflow を検索していることに気づきました。

すべての.NET Framework WPF コントロールの既定のコントロール スタイルとテンプレートの標準的で完全なソースを探しています。

急いで答える前に、読み続けて私の混乱を理解してください。

この Microsoft doc ページDataGrid Styles and Templatesに、次のテンプレートが表示されDataGridCellます。

<!--Style and template for the DataGridCell.-->
<Style TargetType="{x:Type DataGridCell}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border x:Name="border"
                BorderBrush="Transparent"
                BorderThickness="1"
                Background="Transparent"
                SnapsToDevicePixels="True">
          <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="FocusStates">
              <VisualState x:Name="Unfocused" />
              <VisualState x:Name="Focused" />
            </VisualStateGroup>
            <VisualStateGroup x:Name="CurrentStates">
              <VisualState x:Name="Regular" />
              <VisualState x:Name="Current">
                <Storyboard>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetName="border"
                                                Storyboard.TargetProperty="(Border.BorderBrush).
                      (SolidColorBrush.Color)">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource DatagridCurrentCellBorderColor}" />
                  </ColorAnimationUsingKeyFrames
                                                >
                </Storyboard>
              </VisualState>
            </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

MSDN フォーラムのこのページには、次のStyle/ Triggers/ Setters が表示されます。

<SolidColorBrush x:Key="{x:Static DataGrid.FocusBorderBrushKey}" Color="#FF000000"/>
 <Style TargetType="{x:Type DataGridCell}">
 <Setter Property="Background" Value="Transparent"/>
 <Setter Property="BorderBrush" Value="Transparent"/>
 <Setter Property="BorderThickness" Value="1"/>
 <Setter Property="Template">
  <Setter.Value>
  <ControlTemplate TargetType="{x:Type DataGridCell}">
   <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
   <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
   </Border>
  </ControlTemplate>
  </Setter.Value>
 </Setter>
 <Style.Triggers>
  <Trigger Property="IsSelected" Value="True">
  <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
  <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
  <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
  </Trigger>
  <Trigger Property="IsKeyboardFocusWithin" Value="True">
  <Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/>
  </Trigger>
 </Style.Triggers>
 </Style>

最初のテンプレートにプロパティBackgroundForegroundが表示されないのはなぜですか?BorderBrush

参考になるような気がしVisualStateますが、ソースが見つかりません。

4

2 に答える 2

3

ContentPresenter はコンテンツを表示するコントロールです。VisualState のものは、コントロール DataGridCell が遭遇できるすべての VisualState の参照を保持しているだけです。ContentPresenter をラップした Property Border にアニメーションを配置します。

スタイル全体を再定義できます。つまり、他のコントロールを配置してコンテンツを再定義し、TemplateBinding を使用して外部依存プロパティを取得できます。私が意味するようにTemplateBinding Background、VisualState との境界でも使用できます。

    <Style TargetType="{x:Type DataGridCell}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type DataGridCell}">
        <Border x:Name="border"
                BorderBrush=BorderBrush}" BorderThickness="{TemplateBinding      BorderThickness}" Background="{TemplateBinding Background}"
                SnapsToDevicePixels="True">
          <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="FocusStates">
              <VisualState x:Name="Unfocused" />
              <VisualState x:Name="Focused" />
            </VisualStateGroup>
            <VisualStateGroup x:Name="CurrentStates">
              <VisualState x:Name="Regular" />
              <VisualState x:Name="Current">
                <Storyboard>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetName="border"
                                                Storyboard.TargetProperty="(Border.BorderBrush).
                      (SolidColorBrush.Color)">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource DatagridCurrentCellBorderColor}" />
                  </ColorAnimationUsingKeyFrames
                                                >
                </Storyboard>
              </VisualState>
            </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>

それは完全に理にかなっています。ただし、スタイルにそれらを指定しない場合は、コントロールに定義されているデフォルトの色や背景などにフォールバックすることを意味します。

これは、新しい値が上書きされない場合にデフォルト値にフォールバックするためのすべての dependencyProperty のプロパティです。

私の WPF チュートリアルを読んで、次のような概念を理解することができます: http://www.abhisheksur.com/2010/12/wpf-tutorial.html

于 2012-10-11T02:20:10.150 に答える
1

ここで、WPFコントロールの既定のWPFテーマの既定のスタイルの辞書をダウンロードできます。コントロールのスタイルを変更する必要がある場合、デフォルトのスタイルがどのように機能するかを知ることは非常に役立ちます。

于 2012-10-11T10:01:02.627 に答える