2012-03-16 28 views
14

Tengo un proyecto C# que era una aplicación WPF pero ahora quiero compilarlo como un dll. Anteriormente lo hice eliminando app.xaml del proyecto y estableciendo su tipo de compilación en dll.Configurar recursos de aplicación desde el código

El problema que tengo ahora es que la aplicación.xaml contiene algo de xaml para crear una instancia de las variables de la aplicación. Para evitar esto, estoy tratando de establecer programáticamente estas variables de aplicación desde la primera ventana xaml que se llamará.

el XAML que estoy tratando de emular en el código es:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Resources/Styles/Shared.xaml"/> 
     <ResourceDictionary Source="Resources/Styles/ToolBar.xaml"/> 
     <ResourceDictionary Source="Resources/Styles/GroupBox.xaml"/> 
     <ResourceDictionary Source="Resources/Styles/ZoomBox.xaml"/> 
     <ResourceDictionary Source="Resources/Styles/ScrollBar.xaml"/> 
     <ResourceDictionary Source="Resources/Styles/Expander.xaml"/> 
     <ResourceDictionary Source="Resources/ApplicationToolbar.xaml"/> 
     <ResourceDictionary Source="Resources/DesignerItem.xaml"/> 
     <ResourceDictionary Source="Resources/Styles/ToolboxItem.xaml"/> 
     <ResourceDictionary Source="Resources/Styles/Toolbox.xaml"/> 
     <ResourceDictionary Source="Resources/Connection.xaml"/> 
     <ResourceDictionary Source="Resources/Slider.xaml"/> 
     <ResourceDictionary Source="Resources/ScrollViewer.xaml"/> 
     <ResourceDictionary Source="Resources/StatusBar.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    </Application.Resources> 

Este es el código que tengo:

ResourceDictionary myResourceDictionary = new ResourceDictionary(); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\Shared.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\ToolBar.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\GroupBox.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\ZoomBox.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\ScrollBar.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\Expander.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\ApplicationToolbar.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\DesignerItem.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\ToolboxItem.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Styles\\Toolbox.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Connection.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\Slider.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\ScrollViewer.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
      myResourceDictionary.Source = new Uri("C:\\Resources\\StatusBar.xaml"); 
      Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 

caso de este trabajo?

Estoy llegando a un problema en esa Toolbar.xaml hace referencia a un recurso declarado en Shared.xaml pero no se recoge y estoy recibiendo el siguiente error.

Cannot find resource named 'ToolbarSelectedBackgroundBrush'. Resource names are case sensitive. 

Aquí es donde el recurso es delcared en shared.xaml

<LinearGradientBrush x:Key="ToolbarSelectedBackgroundBrush" StartPoint="0,0" EndPoint="0,1"> 
    <GradientBrush.GradientStops> 
     <GradientStopCollection> 
     <GradientStop Color="#FFFEE3" Offset="0.0"/> 
     <GradientStop Color="#FFE797" Offset="0.4"/> 
     <GradientStop Color="#FFD750" Offset="0.4"/> 
     <GradientStop Color="#FFE796" Offset="1.0"/> 
     </GradientStopCollection> 
    </GradientBrush.GradientStops> 
    </LinearGradientBrush> 

y aquí es donde su referencia en toolbar.xaml

<Setter TargetName="Border" Property="Background" Value="{StaticResource ToolbarSelectedBackgroundBrush}" /> 

Lo siento por el ensayo de una pregunta, pero el pensamiento Identificación proporcionar tanta información como pueda. Déjame saber si necesitas algo más.

+0

Su pregunta se refiere a la escritura de código, bec porque ya no usas 'App.xaml' y quieres escribir el código como una solución alternativa. Resulta que * todavía puede * usar 'App.xaml' a partir de https://stackoverflow.com/questions/4441227/wpf-class-library-with-resource-dictionary/4441500#4441500. Luego, el llamador DLL instancia 'App' como en https://stackoverflow.com/a/26890426/1429390. Funciona para mí con todos los recursos trabajando, tiempo de diseño y tiempo de ejecución gracias a los URI relativos. –

Respuesta

19

Este código funciona para mí. Acaba de cambiar los URI relativa a:

ResourceDictionary myResourceDictionary = new ResourceDictionary(); 

myResourceDictionary.Source = new Uri("Dictionary1.xaml", UriKind.Relative); 
Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 

myResourceDictionary.Source = new Uri("Dictionary2.xaml", UriKind.Relative); 
Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary); 
0

Tienes que crear un archivo ResourceDictionary por separado, p. Style.xaml que contiene (no se olvide de los espacios de nombres) Referencia

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Resources/Styles/Shared.xaml"/> 
    <ResourceDictionary Source="Resources/Styles/ToolBar.xaml"/> 
    <ResourceDictionary Source="Resources/Styles/GroupBox.xaml"/> 
    <ResourceDictionary Source="Resources/Styles/ZoomBox.xaml"/> 
    <ResourceDictionary Source="Resources/Styles/ScrollBar.xaml"/> 
    <ResourceDictionary Source="Resources/Styles/Expander.xaml"/> 
    <ResourceDictionary Source="Resources/ApplicationToolbar.xaml"/> 
    <ResourceDictionary Source="Resources/DesignerItem.xaml"/> 
    <ResourceDictionary Source="Resources/Styles/ToolboxItem.xaml"/> 
    <ResourceDictionary Source="Resources/Styles/Toolbox.xaml"/> 
    <ResourceDictionary Source="Resources/Connection.xaml"/> 
    <ResourceDictionary Source="Resources/Slider.xaml"/> 
    <ResourceDictionary Source="Resources/ScrollViewer.xaml"/> 
    <ResourceDictionary Source="Resources/StatusBar.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

final en todos los suyos controla

+1

Creo que él (o ella) quiere hacer eso en el código. – NestorArturo

+0

Podría crear ese marcado desde el código y anexar al árbol visual – pamidur

5

creo que es necesario que se especifique el nombre del componente eran el recurso está sentado en

<ResourceDictionary Source="/<YourDllName>;component/Resources/Styles/Shared.xaml" /> 

Si el archivo DLL se llama My.Wpf.Component.dll usted debe poner My.Wpf.Component

por lo que en el código debe ser

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri(@"/<YourDllName>;component/Resources/Styles/Shared.xaml", UriKind.Relative) }); 
Cuestiones relacionadas