2012-06-15 3 views
1

У меня есть настраиваемый элемент управления, который использует стили, которые находятся в словаре ресурсов, который связан в app.xaml. Если я удалю ссылку и добавлю ссылку на страницу, содержащую элемент управления, это не сработает. Почему это? Почему мой элемент управления (dll) должен иметь стили в app.xaml, а не только на странице, в которой содержится элемент управления?Перемещение App.xaml стилей в словарь ресурсов

ответ

0

Попробуйте переместить стиль в элемент управления, чтобы убедиться, что все требуемые ссылки используются для управления элементами из словаря. Убедитесь, что проект, содержащий ваш UserControl, имеет ссылку на проект, содержащий словарь ресурсов. Проверьте свой исходный путь к словарю:

<ResourceDictionary Source="/AssemblyName;component/StylesFolderName/ResourceDictionaryName.xaml" />

+1

Исходный путь для словаря, который работает в app.xaml, является тем же, что и на странице, путь правильный. Словарь ресурсов находится в том же проекте, что и страница, содержащая элемент управления - я поместил его в одну и ту же папку, и это не имеет никакого значения. Все работает отлично, когда в app.xaml есть ссылка на словарь ресурса, когда я перехожу к этой ссылке на страницу, он не работает - элемент управления не может найти нужные стили. Все файлы в одном проекте (элемент управления - dll) ... зачем нужно искать стиль в app.xaml? –

+0

Если элемент управления находится в DLL, тогда проект, содержащий элемент управления, должен будет ссылаться на проект, содержащий словарь ресурсов. – jrockers

+0

Проект, содержащий элемент управления, представляет собой проект, содержащий словарь ресурсов. –

3

Почему мой контроль (а длл) нужны стили, чтобы быть в app.xaml, а не только на странице, что элемент управления содержится в ?

Пользовательские элементы управления требуют стиля по умолчанию. Этот стиль по умолчанию устанавливается внутри конструктора. например:

public CustomControl() 
{ 
    DefaultStyleKey = typeof(CustomControl); 
} 

Когда это установлено, он выглядит внутри контейнера для сборки этого стиля. Если элемент управления находится внутри приложения, он выглядит в App.xaml. Если элемент управления находится внутри библиотеки классов, он выглядит в файле Generic.xaml, который должен быть помещен в папку «Темы». Вам не нужно размещать стиль в любом из этих файлов. Вы можете создать отдельный файл, который содержит этот стиль, и ссылаться на него из App.xaml или Themes/Generic.xaml (на основе определения элемента управления). Для этого вы создаете MergedDictionary в одном из этих файлов. Если элемент управления определяется в приложении вы могли бы сделать

<Application x:Class="MyApp.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <!--Application Resources--> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Controls/CustomControl.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    <Application.Resources> 
</Application> 

Если элемент управления определяется в библиотеке классов Темами/Generic.xaml должен выглядеть следующим образом

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/My.Custom.Assembly;component/FolderLocationOfXaml/CustomControl.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Не важно, где ваш пользовательский элемент управления помещается в XAML для этого всегда будет выглядеть одинаково

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:My.Custom.Assembly.Controls"> 
     <Style TargetType="local:CustomControl"> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:CustomControl"> 
        <Grid> 
         <! -- Other stuff here --> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

Без этого стиля заданный по умолчанию, нет никакого способа определить, какой стиль для переопределения. После определения стиля по умолчанию вы можете изменить стиль в своем приложении или где-либо еще, когда используется элемент управления.

+0

Вот и проблема. Стиль элемента управления уже установлен в элементе управления - он имеет generic.xaml и все это с необходимыми стилями по умолчанию. Не смотрит ли он сначала, а затем в app.xaml? –

+0

Можете ли вы показать пример того, что вы пытаетесь сделать –

+0

Спасибо! Четкий ответ, хорошее объяснение. – Michiel

Смежные вопросы