2012-04-11 63 views
1

我在我的項目中有一個ScrollBar樣式,它被所有ScrollBar實例自動使用,包括其中有一個ScrollBar的控件。現在是在項目中使用DataGrid的時候了,但我不希望它採用ScrollBar風格,因爲它與DataGrid的默認樣式的其餘部分發生衝突,而且我沒有時間弄清楚如何製作DataGrid樣式將與滾動條一致。如何設置嵌套控件的樣式?

整個上午Google搜索這個問題之後,我嘗試了我找到的這個解決方案:我使用了我的表達式混合的試用版將ScrollBar的默認樣式作爲資源字典保存到單獨的xaml文件中。我將這個xaml文件添加到我的項目中,並將其與應用程序級別的其他資源字典合併。在DataGrid中使用窗口XAML文件,我嘗試這樣做:

<Window x:Class="Chart.ChartDataGrid.ChartDataGridWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Chart.ChartDataGrid" 
    Title="ChartDataGridWindow" Height="300" Width="300" 
    WindowStartupLocation="CenterOwner" 
    > 
<Grid> 
    <DataGrid ItemsSource="{Binding ValuesView}" AutoGenerateColumns="False" 
       x:Name="_dataGrid"> 
     <DataGrid.Resources> 
      <Style TargetType="ScrollBar" BasedOn="{StaticResource {x:Static ScrollBarStyleDefault}}" /> 
     </DataGrid.Resources> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Date/Time" Binding="{Binding TradeDate}" /> 
      <DataGridTextColumn Header="Price" Binding="{Binding Price}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
</Window> 

編譯時,在風格上會產生一個錯誤:

錯誤MC3029:「ScrollBarStyleDefault」成員是因爲它沒有有效沒有合格的類型名稱。

這裏是滾動式的XAML文件,這是我從Expression Blend中有:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"> 

<LinearGradientBrush x:Key="VerticalScrollBarBackgroundDefault" EndPoint="1,0" StartPoint="0,0"> 
    <GradientStop Color="#E1E1E1" Offset="0"/> 
    <GradientStop Color="#EDEDED" Offset="0.20"/> 
    <GradientStop Color="#EDEDED" Offset="0.80"/> 
    <GradientStop Color="#E3E3E3" Offset="1"/> 
</LinearGradientBrush> 
<!-- Resource dictionary entries should be defined here. --> 
<SolidColorBrush x:Key="ScrollBarDisabledBackgroundDefault" Color="#F4F4F4"/> 
<Style x:Key="ScrollBarButtonDefault" TargetType="{x:Type RepeatButton}"> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="Focusable" Value="false"/> 
    <Setter Property="IsTabStop" Value="false"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type RepeatButton}"> 
       <Microsoft_Windows_Themes:ScrollChrome x:Name="Chrome" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" SnapsToDevicePixels="true" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="{TemplateBinding Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="VerticalScrollBarPageButtonDefault" TargetType="{x:Type RepeatButton}"> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="Focusable" Value="false"/> 
    <Setter Property="IsTabStop" Value="false"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type RepeatButton}"> 
       <Rectangle Fill="{TemplateBinding Background}" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="ScrollBarThumbDefault" TargetType="{x:Type Thumb}"> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="IsTabStop" Value="false"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Thumb}"> 
       <Microsoft_Windows_Themes:ScrollChrome x:Name="Chrome" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsDragging}" SnapsToDevicePixels="true" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="{TemplateBinding Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<LinearGradientBrush x:Key="HorizontalScrollBarBackgroundDefault" EndPoint="0,1" StartPoint="0,0"> 
    <GradientStop Color="#E1E1E1" Offset="0"/> 
    <GradientStop Color="#EDEDED" Offset="0.20"/> 
    <GradientStop Color="#EDEDED" Offset="0.80"/> 
    <GradientStop Color="#E3E3E3" Offset="1"/> 
</LinearGradientBrush> 
<Style x:Key="HorizontalScrollBarPageButtonDefault" TargetType="{x:Type RepeatButton}"> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="Focusable" Value="false"/> 
    <Setter Property="IsTabStop" Value="false"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type RepeatButton}"> 
       <Rectangle Fill="{TemplateBinding Background}" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<Style x:Key="ScrollBarDefaultStyle" TargetType="{x:Type ScrollBar}"> 
    <Setter Property="Background" Value="{StaticResource VerticalScrollBarBackgroundDefault}"/> 
    <Setter Property="Stylus.IsPressAndHoldEnabled" Value="false"/> 
    <Setter Property="Stylus.IsFlicksEnabled" Value="false"/> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
    <Setter Property="Width" Value="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"/> 
    <Setter Property="MinWidth" Value="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ScrollBar}"> 
       <Grid x:Name="Bg" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> 
        <Grid.RowDefinitions> 
         <RowDefinition MaxHeight="{DynamicResource {x:Static SystemParameters.VerticalScrollBarButtonHeightKey}}"/> 
         <RowDefinition Height="0.00001*"/> 
         <RowDefinition MaxHeight="{DynamicResource {x:Static SystemParameters.VerticalScrollBarButtonHeightKey}}"/> 
        </Grid.RowDefinitions> 
        <RepeatButton Command="{x:Static ScrollBar.LineUpCommand}" IsEnabled="{TemplateBinding IsMouseOver}" Style="{StaticResource ScrollBarButtonDefault}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="UpArrow"/> 
        <Track x:Name="PART_Track" IsDirectionReversed="true" IsEnabled="{TemplateBinding IsMouseOver}" Grid.Row="1"> 
         <Track.DecreaseRepeatButton> 
          <RepeatButton Command="{x:Static ScrollBar.PageUpCommand}" Style="{StaticResource VerticalScrollBarPageButtonDefault}"/> 
         </Track.DecreaseRepeatButton> 
         <Track.IncreaseRepeatButton> 
          <RepeatButton Command="{x:Static ScrollBar.PageDownCommand}" Style="{StaticResource VerticalScrollBarPageButtonDefault}"/> 
         </Track.IncreaseRepeatButton> 
         <Track.Thumb> 
          <Thumb Style="{StaticResource ScrollBarThumbDefault}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="VerticalGripper"/> 
         </Track.Thumb> 
        </Track> 
        <RepeatButton Command="{x:Static ScrollBar.LineDownCommand}" IsEnabled="{TemplateBinding IsMouseOver}" Grid.Row="2" Style="{StaticResource ScrollBarButtonDefault}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="DownArrow"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Background" TargetName="Bg" Value="{StaticResource ScrollBarDisabledBackgroundDefault}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="Orientation" Value="Horizontal"> 
      <Setter Property="Width" Value="Auto"/> 
      <Setter Property="MinWidth" Value="0"/> 
      <Setter Property="Height" Value="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarHeightKey}}"/> 
      <Setter Property="MinHeight" Value="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarHeightKey}}"/> 
      <Setter Property="Background" Value="{StaticResource HorizontalScrollBarBackgroundDefault}"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ScrollBar}"> 
         <Grid x:Name="Bg" Background="{TemplateBinding Background}" SnapsToDevicePixels="true"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition MaxWidth="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"/> 
           <ColumnDefinition Width="0.00001*"/> 
           <ColumnDefinition MaxWidth="{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"/> 
          </Grid.ColumnDefinitions> 
          <RepeatButton Command="{x:Static ScrollBar.LineLeftCommand}" IsEnabled="{TemplateBinding IsMouseOver}" Style="{StaticResource ScrollBarButtonDefault}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="LeftArrow"/> 
          <Track x:Name="PART_Track" Grid.Column="1" IsEnabled="{TemplateBinding IsMouseOver}"> 
           <Track.DecreaseRepeatButton> 
            <RepeatButton Command="{x:Static ScrollBar.PageLeftCommand}" Style="{StaticResource HorizontalScrollBarPageButtonDefault}"/> 
           </Track.DecreaseRepeatButton> 
           <Track.IncreaseRepeatButton> 
            <RepeatButton Command="{x:Static ScrollBar.PageRightCommand}" Style="{StaticResource HorizontalScrollBarPageButtonDefault}"/> 
           </Track.IncreaseRepeatButton> 
           <Track.Thumb> 
            <Thumb Style="{StaticResource ScrollBarThumbDefault}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="HorizontalGripper"/> 
           </Track.Thumb> 
          </Track> 
          <RepeatButton Grid.Column="2" Command="{x:Static ScrollBar.LineRightCommand}" IsEnabled="{TemplateBinding IsMouseOver}" Style="{StaticResource ScrollBarButtonDefault}" Microsoft_Windows_Themes:ScrollChrome.ScrollGlyph="RightArrow"/> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Background" TargetName="Bg" Value="{StaticResource ScrollBarDisabledBackgroundDefault}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

這裏是我的App.xaml文件:

<Application x:Class="StockChart.App" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
StartupUri="MainWindow.xaml"> 
<Application.Resources> 
    <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Themes/BlackGloss.xaml" /> 
      <ResourceDictionary Source="Themes/ScrollBarDefault.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
</Application> 

有誰知道去做這個?

謝謝!

亞歷

回答

1

如果不設置BasedOn,它會使用默認的樣式。試試這個爲您的風格:

<Style TargetType="ScrollBar" /> 
+0

這工作,謝謝! – Alex 2012-04-11 19:31:31