2016-12-22 1 views
0

У меня есть приложение, которое использует несколько настраиваемых тем, которые можно переключать во время выполнения. Темы, приложение и пользовательский интерфейс (UserControls, dialogs и т. Д.) Каждый находятся в отдельной сборке .NET.Резервное копирование отсутствующего стиля в приложении без прикладной темы

Темы не только переопределяют неявные стили стилей по умолчанию (новый шаблон управления), но также предоставляют различные явные стили.

Пример:

<!-- "Themes" assembly --> 
<Style TargetType="Button" x:Key="DialogButtonStyle" 
     BasedOn="{StaticResource BaseButtonStyle}"> 
    <Setter Property="HorizontalAlignment" Value="Left" /> 
    <Setter Property="Height" Value="24" /> 
    <Setter Property="MinWidth" Value="86" /> 
    <Setter Property="Padding" Value="8 0" /> 
</Style> 

<!-- "UI" assembly --> 
<Button Style="{DynamicResource DialogButtonStyle}" 
     Content="OK" /> 

Темы применяются путем объединения всех их стили, кисти и т.д. в ресурсах приложения, например: (. Или соответствующий код во время выполнения)

<Application x:Class="GUIDemo.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources>  
     <ResourceDictionary x:Name="MainDictionary"> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary x:Name="ThemeDictionary"> 
        <ResourceDictionary.MergedDictionaries> 
         <ResourceDictionary Source="/Themes;component/SystemTheme.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
       </ResourceDictionary> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary>  
    </Application.Resources> 
</Application> 

Вопрос:

Можно ли определить стили возврата в моей сборке пользовательского интерфейса (а не в сборке приложений)? Они должны быть автоматически применены, если приложение не включило ни одну из тем, то есть когда ключи типа «DialogButtonStyle» не определены и вызывают сообщения об ошибках на выходе.

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

Что я пробовал:

(1) Определение фиктивный app.xaml, который содержит стиль запасной. Это работает во время разработки (предварительный просмотр дизайнера, завершение кода), но не во время выполнения.

(2) Определите стили в «Темы/Generic.xaml». Кажется, что это работает только для неявных стилей, а не для явных стилей.

(3) Объедините Generic.xaml в ресурсы всех файлов XAML, которые используют этот стиль. Это не работает, потому что стиль теперь переопределяет тему.

ответ

0

Попытка объединить стили замещающего в ваш ResourceDictionary перед тем вы объединяете тематические ресурсы:

<Application.Resources> 
    <ResourceDictionary x:Name="MainDictionary"> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="FallbackResources.xaml" /> 
      <ResourceDictionary Source="/Themes;component/SystemTheme.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Затем тематические ресурсы - если таковые имеются - должны переопределить резервные ресурсы.

Нет, это не то, что я имел в виду. Я хочу, чтобы резервные копии были определены в сборке пользовательского интерфейса (а не в приложении). Весь смысл резервных копий состоит в том, чтобы убедиться, что стили определены, даже если приложение правильно применяет тему (или другие файлы ресурсов).

Невозможно, чтобы приложение могло применять эти резервные ресурсы, если вы не объедините их в свое приложение. Если приложение не использует какой-либо ресурсный словарь из внешней сборки, вы получите исключения во время выполнения, если попытаетесь ссылаться на любой из этих ресурсов в своих представлениях. Ресурсы должны быть явно объединены в приложение каким-то образом.

+0

Нет, это не то, что я имел в виду. Я хочу, чтобы резервные копии были определены в сборке пользовательского интерфейса (а не в приложении).Весь смысл резервных копий состоит в том, чтобы убедиться, что стили определены, даже если приложение правильно применяет тему (или другие файлы ресурсов). –

+0

Нет, тогда. Вам нужно явно указать приложению, что эти ресурсы действительно существуют и где их найти. Я отредактировал свой ответ. – mm8

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