Pergunta

Eu tenho um C # biblioteca (2008 / .NET 3.5) classe de montagem que suporta o WPF (baseado em este artigo )-a-wpf-control-biblioteca de template-to visual-c-expressar-2008.
Eu criei várias janelas, e agora estou tentando criar um estilo comum definido para eles. No entanto, como é uma biblioteca de classe (em vez de um aplicativo WPF), eu não tenho um app.xaml (e sua aplicação contida & Application.Resources correspondentes) para armazenar esses estilos para o acesso global.

Assim: Como posso criar um conjunto de nível superior de definições de estilo que vai ser visto por todos os arquivos XAML na assembléia, , uma vez que eu não tenho app.xaml ( veja acima) ? E / ou é possível Adicionar a app.xaml trabalhando para uma biblioteca de classes?

FYI, eu tente criar um ResourceDictionary em um arquivo ResourceDictionary.xaml, e incluí-lo em cada janela dentro de um bloco "Window.Resources". Que acabou por resolver o estilo de botões, etc ... mas não para a janela de inclusão. Eu posso colocar Style="{StaticResource MyWindowStyle}" no bloco de abertura da janela, e ele compila e mostra-se na janela bem contra o design, mas durante a execução real eu recebo uma exceção de análise (MyWindowStyle não pôde ser encontrado, eu estou supondo Visual Studio vê o dicionário incluído após a linha em questão, mas a CRL faz as coisas mais sequencialmente e, portanto, não foi carregado o ResourceDictionary ainda).


Obrigado pelas idéias, mas ainda sem ir ... aparentemente uma biblioteca de classe não suporta o uso generic.xaml implicitamente. Eu adicionei generic.xaml ao meu projeto de biblioteca de classe e defina seu Criar ação para "Recurso". Ele contém:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Window}" x:Key="MyWindow">
        <Setter Property="Background" Value="Black"/>
    </Style>
</ResourceDictionary>

O XAML janela que eu quero ter utilizar os olhares temáticos como este:

<Window x:Class="MyAssembly.ConfigureGenericButtons"
    x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Style="{StaticResource MyWindow}"
    Title="ConfigureGenericButtons">
...Buttons, etc...
</Window>

Embora a janela de VS projeto não mostra a janela usando o estilo MyWindow (ie fundo preto), que compila bem e começa-se. No entanto, quando o aplicativo que contém este biblioteca de classes faz uma chamada que faz com que esta janela para exibição, eu recebo um XamlParseException:

Não é possível localizar recurso chamado '{MyWindow}'.

Eu também tentei deixando de fora o parâmetro Style, para ver se a janela usaria o estilo por padrão (e eu tentei que tanto com o x: Key em generic.xaml incluído e sem). Sem erros, mas qualquer coisa definidos no generic.xaml não apareceu qualquer um.

Estou fazendo algo errado aqui, ou quaisquer outras ideias sobre como se poderia permitir estilos personalizados comuns para ser usado em uma janela (ou seja, não tem que definir os estilos em XAML de cada janela) - com a ressalva de que este NÃO é uma aplicação?

Foi útil?

Solução

Tente adicionar

Style={DynamicResource MyStyle}

Você não pode usar um StaticResource neste caso.

Outras dicas

Isso soa como um trabalho para theming.

  1. Adicionar um ResourceDictionary /themes/generic.xaml ao seu projeto.
  2. Adicione o seguinte ao AssemblyInfo.cs: [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
  3. ?
  4. lucro!

Todos os recursos que você adicionar à genérico será utilizado por todos os controles. Também você pode fazer temas perfil específico (Luna, Aero etc.) através da inclusão de um arquivo ResourceDictionary com o nome do tema correto no diretório themes.

Aqui está um link para mais informações: Criar e aplicar temas personalizados

Se você não tem um app.xaml, você ainda pode carregá-lo nos recursos de nível appplication, mas você tem que escrever código (não XAML) para fazê-lo, semelhante a este ...

void LoadIt()
{
     ResourceDictionary MyResourceDictionary = new ResourceDictionary();
     MyResourceDictionary.Source = new Uri("MyResources.xaml", UriKind.Relative);
     App.Current.Resources.MergedDictionaries.Add(  MyResourceDictionary )
}

confira este site para ver um exemplo: http: // ascendedguard .com / 2007/08 / one-of-Nice-características sobre-wpf-é-how.html

Dr. WPF (ou a pessoa anteriormente conhecido como Dr. WPF) tem um grande post sobre o assunto.

Aqui está um trecho do post onde eles criam o objeto Application e adicionar recursos:

if (Application.Current == null)
{
    // create the Application object
    new Application();

    // merge in your application resources
    Application.Current.Resources.MergedDictionaries.Add(
        Application.LoadComponent(
            new Uri("MyLibrary;component/Resources/MyResourceDictionary.xaml",
            UriKind.Relative)) as ResourceDictionary);
}

Desde a minha montagem está hospedado através de interoperabilidade eu tive que adicionar definindo o ShutdownMode como segue e desligamento quando acabado:

new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown };

Ele trabalhou como um encanto.

Se você carregá-lo no Window.Resource, o dicionário está disponível apenas para as crianças dessa janela. Você precisa tê-lo disponível para a janela e seus filhos.

Tente carregá-lo em seu arquivo app.xaml. Que deve torná-lo um recurso de nível de aplicativo, não um recurso de nível de janela.

Assim, depois de passar muito tempo eu finalmente descobri isso. Veja como:

  1. Em WPF biblioteca de controles, adicionar uma nova pasta themes nomeado.
  2. Dentro da pasta themes, adicionar um dicionário de recursos generic.xaml nomeado.
  3. Dentro generic.xaml, adicionar os seus recursos usando a seguinte sintaxe:

    <SolidColorBrush x:Key="{ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}" Color="Blue" />
    
  4. Em seu controle, use a seguinte sintaxe para acessar esse recurso:

    Background="{StaticResource {ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}}"
    

coisas a nota:

  1. Passo 1 e 2 são normalmente feito automaticamente para você pelo Visual Studio quando você cria uma nova Controles WPF Biblioteca.
  2. Eu não entendo completamente o propósito de primeiro parâmetro de ComponentResourceKey, mas é necessário. Use o nome do controle que irá consumir este recurso.
  3. desenhador
  4. Visual Studio não foi capaz de localizar o recurso no meu caso. Poderia ser um problema de cache, não tenho certeza. Em tempo de execução no entanto, funciona perfeitamente.
  5. Você pode ler mais detalhes sobre esta sintaxe em este MSDN artigo .

Espero que isso faz com que algumas vidas mais fáceis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top