Я пишу программу 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
синтаксиса без успеха
Вы пытались использовать относительный путь вместо синтаксиса uri пакета? или сменить URI пакета на –
Я использую Синтаксис 'pack' как' Generic.xaml' находится в другой сборке, хотя я мог бы попробовать разместить их в одном проекте. –
Попробуйте поместить все файлы ресурсов в один и тот же проект и используя либо относительный путь, либо пакет: // application: ,,,/Subfolder/ResourceFile.xaml ... –