2012-02-23 136 views
2

我正在清理App.xaml並將一些樣式移入Generic.xaml。但是,這些樣式沒有任何效果。爲什麼?這是正確的事情做App.xaml整潔嗎?爲什麼我的Generic.xaml樣式不起作用?

EDIT(包括一些源代碼):

的目標是再整WPF DataGrid中,使從上到下和從左至右(默認樣式不包括行和列標題)中運行的滾動條。

當我把它放在App.xaml中時,這種風格正在起作用。因爲它是一大塊代碼,所以我想將它從App.xaml移出到/Themes/DataGridEx.xaml中。順便說一下,DataGridEx是從WPF DataGrid派生的擴展類。

這是我DataGrid.xaml:

<ControlTemplate x:Key="SelectAllButtonTemplate" TargetType="{x:Type Button}"> 
    <Grid> 
     <Rectangle x:Name="Border" 
      Fill="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
      SnapsToDevicePixels="True" /> 
     <Polygon x:Name="Arrow" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Bottom" 
      Margin="8,8,3,3" 
      Opacity="0.15" 
      Fill="Black" 
      Stretch="Uniform" 
      Points="0,10 10,10 10,0" /> 
    </Grid> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter TargetName="Border" Property="Stroke" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> 
     </Trigger> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter TargetName="Border" Property="Fill" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter TargetName="Arrow" Property="Visibility" Value="Collapsed" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

<Style TargetType="{x:Type local:DataGridEx}" x:Key="{x:Type local:DataGridEx}"> 
    <Setter Property="Background" 
      Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
    <Setter Property="Foreground" 
      Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
    <Setter Property="BorderBrush" Value="#FF688CAF" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" /> 
    <Setter Property="ScrollViewer.CanContentScroll" 
      Value="true"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:DataGridEx}"> 
       <Border Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       SnapsToDevicePixels="True" 
       Padding="{TemplateBinding Padding}"> 
        <ScrollViewer Focusable="false" 
         Name="DG_ScrollViewer"> 
         <ScrollViewer.Template> 
          <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
           <Grid> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto"/> 
             <RowDefinition Height="*"/> 
             <RowDefinition Height="Auto"/> 
            </Grid.RowDefinitions> 

            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="*"/> 
             <ColumnDefinition Width="Auto"/> 
            </Grid.ColumnDefinitions> 

            <!--Left Column Header Corner --> 
            <Button Command="{x:Static local:DataGridEx.SelectAllCommand}" 
         Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DataGridEx}}, Path=CellsPanelHorizontalOffset}" 
         Template="{StaticResource SelectAllButtonTemplate}" 
         Focusable="false" 
         Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DataGridEx}}, Path=HeadersVisibility, Converter={x:Static local:DataGridEx.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.All}}" /> 
            <!--Column Headers--> 
            <DataGridColumnHeadersPresenter Grid.Column="1" 
                x:Name="PART_ColumnHeadersPresenter" 
                Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:DataGridEx}}, Path=HeadersVisibility, Converter={x:Static DataGrid.HeadersVisibilityConverter}, ConverterParameter={x:Static DataGridHeadersVisibility.Column}}"/> 

            <!--DataGrid content--> 
            <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="1" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" /> 

            <!-- Changed Grid.Row="1" to Grid.Row="0" Grid.RowSpan="2" to make the scrollbar start from top --> 
            <ScrollBar Grid.Row="0" Grid.RowSpan="2" Grid.Column="2" Name="PART_VerticalScrollBar" 
             Orientation="Vertical" 
             Maximum="{TemplateBinding ScrollableHeight}" 
             ViewportSize="{TemplateBinding ViewportHeight}" 
             Value="{Binding Path=VerticalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
             Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"/> 

            <!--Grid Grid.Row="2" Grid.Column="1"> 
        <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type dg:DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/> 
        <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 
        <ScrollBar Grid.Column="1" 
          Name="PART_HorizontalScrollBar" 
          Orientation="Horizontal" 
          Maximum="{TemplateBinding ScrollableWidth}" 
          ViewportSize="{TemplateBinding ViewportWidth}" 
          Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
          Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/> 

       </Grid--> 
            <!-- Make the scrollbar to start from left edge --> 
            <ScrollBar Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" 
              Name="PART_HorizontalScrollBar" 
              Orientation="Horizontal" 
              Maximum="{TemplateBinding ScrollableWidth}" 
              ViewportSize="{TemplateBinding ViewportWidth}" 
              Value="{Binding Path=HorizontalOffset, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
              Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"/> 
           </Grid> 
          </ControlTemplate> 
         </ScrollViewer.Template> 
         <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsGrouping" Value="true"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

這是我的主題/ Generic.xaml:

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="/Themes/DataGridEx.xaml"/> 
    <ResourceDictionary Source="/Themes/GridComboBox.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

這是我的App.xaml:

<Application x:Class="MyApp.App" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:MyApp.Common" 
       DispatcherUnhandledException="Application_DispatcherUnhandledException"> 
       <!--StartupUri="MainWindow.xaml"--> 
     <Application.Resources> 
      <ResourceDictionary x:Key="rd"> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="Themes/Generic.xaml"/> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
.... 
     </Application.Resources> 
    </Application> 

有了這個代碼,我得到了一個運行時XamlParseException:「無法創建從文本‘類型’‘地方:DataGridEx’」。但是,如果我在App.xaml中註釋掉MergedDictionaries,它不會投訴,但樣式也不會生效。

另一個有趣的事情是,在這個generic.xaml中,我有兩個字典。如果我從App.xaml中刪除ResourceDictionary,GridComboBox.xaml工作正常,但DataGridEx.xaml不工作。

回答

3

你需要將其合併到的App.xaml像這樣:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Generic.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

如果你已經這樣做,你需要發佈您的代碼提供更多的信息。編號: 請按照說明here進行操作。特別是有關必須將詞典設置爲資源並在源中使用完整路徑的部分。

+1

爲什麼我需要明確地合併?當它放置在Themes文件夾中時它不會自動合併嗎? – newman 2012-02-23 13:40:57

+0

我將ThemeInfo更改爲您的建議,但它沒有任何區別。我嘗試了幾件事情,遇到了不同的問題。我會在我的問題中發佈我的代碼。 – newman 2012-02-23 14:57:52

+0

順便說一句,正如我從其他測試中發現的那樣,如果將generic.xaml的構建操作設置爲Resource,則不起作用,但如果將構建操作設置爲默認的「Page」,則工作正常。 – newman 2012-02-24 01:21:36

0

我遇到了這個問題,最簡單的解決方法是刪除要在ResourceDictionary中使用的樣式的x:Key屬性。

<ControlTemplate TargetType="{x:Type Button}">