2013-10-02 2 views
1

Я пишу программу WPF на работе, которая использует настраиваемый элемент управления AnimatedScrollViewer, наследующий от ScrollViewer. Он имеет следующий шаблон по умолчанию:Стиль пользовательского контроля WPF применяется только на определенных компьютерах

<Style TargetType="{x:Type Controls:AnimatedScrollViewer}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Controls:AnimatedScrollViewer}"> 
       <Grid x:Name="PART_LayoutRoot"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="*" /> 
         <RowDefinition Height="Auto" /> 
        </Grid.RowDefinitions> 

        <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" /> 

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

         <ScrollBar x:Name="PART_HorizontalScrollBar" 
            Orientation="Horizontal" 
            IsEnabled="{TemplateBinding IsPaused}" 
            Value="{TemplateBinding HorizontalOffset}" 
            Maximum="{TemplateBinding ScrollableWidth}" 
            ViewportSize="{TemplateBinding ViewportWidth}" 
            Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" /> 

         <StackPanel Grid.Column="1"> 
          <Image Source="{StaticResource LockedImage}" 
            Visibility="{TemplateBinding IsPlaying, Converter={StaticResource boolToVisConverter}}"/> 
          <Image Source="{StaticResource UnlockedImage}" 
            Visibility="{TemplateBinding IsPaused, Converter={StaticResource boolToVisConverter}}"/> 
         </StackPanel> 
        </Grid> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Я устанавливаю это как стиль по умолчанию с помощью:

[...] 
public class AnimatedScrollViewer : ScrollViewer 
{ 
    static AnimatedScrollViewer() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(AnimatedScrollViewer), new FrameworkPropertyMetadata(typeof(AnimatedScrollViewer))); 
    } 
[...] 

Стиль на который ссылается в ниже Generic.xaml словаря, который в свою очередь ссылается как MergedDictionary в App.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="ConvertersDictionary.xaml" /> 
     <ResourceDictionary Source="pack://application:,,,/JamesWright.Utils.EndpointCaller.Views;component/Themes/EndpointStyles.xaml" /> 
     <ResourceDictionary Source="pack://application:,,,/JamesWright.Utils.EndpointCaller.Views;component/Themes/ImageResources.xaml" /> 
     <ResourceDictionary Source="pack://application:,,,/JamesWright.Utils.EndpointCaller.Views;component/Themes/Resources.xaml" /> 
     <ResourceDictionary Source="pack://application:,,,/JamesWright.Utils.EndpointCaller.Views;component/Controls/AnimatedScrollViewer.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

что действительно странно, что этот стиль применяется только к контролю, когда программа запуска на моей собственной машине и виртуальной машине Windows 8.1, в то время как она не применяется на компьютере моего коллеги и в командной машине. Я знаю, что стиль не применяется, потому что связанный ScrollBar должен быть включен только тогда, когда «IsPaused» является истинным. Однако на машине моего коллеги он всегда включен. Кроме того, изображения, которые я указал в шаблоне, не отображаются.

Есть ли какие-либо известные причины, по которым Style не может быть применен к определенным машинам? Я декомпилировал приложение, и ресурсы ссылаются на правильные файлы. Любая помощь приветствуется, поскольку мы вытягиваем наши волосы весь день: P

ОБНОВЛЕНИЕ: Я загрузил его на свой ноутбук с Windows 8, и этот стиль применяется правильно.

UPDATE # 2: Я попытался использовать относительные пути в отличие от pack синтаксиса без успеха

+0

Вы пытались использовать относительный путь вместо синтаксиса uri пакета? или сменить URI пакета на

+0

Я использую Синтаксис 'pack' как' Generic.xaml' находится в другой сборке, хотя я мог бы попробовать разместить их в одном проекте. –

+0

Попробуйте поместить все файлы ресурсов в один и тот же проект и используя либо относительный путь, либо пакет: // application: ,,,/Subfolder/ResourceFile.xaml ... –

ответ

0

После прочтения принятого ответа на this question, я считаю, что вопрос вниз к различным темам системы, хотя настройки между моей машиной и компьютером команды выглядит одинаково. Если я использую стиль явно с использованием атрибута Style, то правильное поведение наблюдается на всех машинах.

Я собираюсь продолжить исследование отношений между темами Windows и шаблонами управления WPF по умолчанию, и я обновлю этот ответ, если найду что-нибудь полезное.