2012-02-23 7 views
2

Я очищаю App.xaml и перемещаю некоторые стили в Generic.xaml. Но тогда эти стили не имеют никакого эффекта. Зачем? Это правильная вещь, чтобы сделать App.xaml tidy?Почему мой стиль в 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: «Не удалось создать„Type“из текста 'местный: DataGridEx». Однако, если я комментирую MergedDictionaries в App.xaml, он не жалуется, но стиль тоже не вступает в силу.

Еще одна интересная вещь: в этом generic.xaml у меня есть два словаря. Если я удалю ResourceDictionary из App.xaml, GridComboBox.xaml работает нормально, но DataGridEx.xaml - нет.

ответ

3

Вам необходимо объединить его в App.xaml так:

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

Если вы уже делаете это, вы должны разместить свой код, чтобы дать больше информации.

EDIT: Попробуйте выполнить инструкции here. В частности, части, связанные с необходимостью установки ваших словарей в Resource и использования полного пути в Source.

+1

Зачем мне нужно явно объединять? Не сливается ли она автоматически, когда она помещается в папку «Темы»? – newman

+0

Я изменил ThemeInfo на ваше предложение, но это не имеет никакого значения. Я пробовал несколько вещей и сталкивался с разными проблемами. Я отправлю свой код в свой вопрос. – newman

+0

Кстати, как я узнал из другого теста, он не работает, если я устанавливаю действие сборки для generic.xaml в Resource, но он отлично работает, если для действия сборки установлено значение «Страница». – newman

0

Я столкнулся с этой проблемой, и простейшим решением для этого является удаление свойства x: Key стиля, который будет использоваться в ResourceDictionary.

<ControlTemplate TargetType="{x:Type Button}"> 
Смежные вопросы