2009-05-25 9 views
6

Estoy intentando utilizar un enfoque MVVM-ish para mi desarrollo de WPF.Fundamentos de WPF: Estilos globales compartidos para MVVM

Tengo mis clases de modelo de vista lógica en el espacio de nombres de ViewModel, y tengo estilo coincidente para estas clases de modelos de vista en el espacio de nombres de Vista.

Por el momento, tengo mi información de visualización en los archivos ResourceDictionary XAML, como plantillas de datos y estilos, que están todos fusionados en la única App.Resources ResourceDictionary en app.xaml.

Sin embargo, me encuentro con una especie de problema de huevo/pollo. Quiero que haya estilos globales que use en todas partes. Por ejemplo, quiero mi propio estilo de texto personalizado llamado MonkeyText, que podría usarse en varios estilos por todo el lugar. No puedo simplemente configurar esto en el archivo app.xaml, porque los recursos de recursos que querrán usar MonkeyText están incluidos en ese archivo app.xaml.

Supongo que si eso es imposible, una alternativa sería usar UserControls en lugar de usar DataTemplates para establecer mis vistas? Me temo que el uso de UserControls uniría las partes VM y V muy juntas.

Respuesta

10

WPF proporciona DynamicResources por esta razón. Los StaticResources, que se asemejan más a las referencias "tradicionales" en programación, tienen solo el problema que encontraste; necesitan ser definidos y cargados antes del punto en que se analiza un estilo. DynamicResources, por otro lado, no necesitan ser definidos antes del punto en que se usan, de hecho, incluso puedes crearlos sobre la marcha. WPF se encarga de garantizar que DynamicResources se cargue automáticamente por todos los estilos que hacen referencia a ellos una vez que se cargan realmente.

El uso de DynamicResources es sencillo. Al crear su estilo MonkeyText, crearlo como lo haría normalmente:

<Style TargetType="TextBlock" x:Key="MonkeyText"> 
    <Setter Property="TextAlignment" Value="Center"/> 
    <!-- etc. --> 
</Style> 

Y a continuación, se refieren a ella el uso de otra parte un DynamicResource:

<TextBlock Text="Hello, World!" Style="{DynamicResource MonkeyText}"/> 

Si, por cualquier razón, WPF no puede resolver su DynamicResource , fallará silenciosamente sin ninguna excepción lanzada (los StaticResources arrojan excepciones cuando no se puede resolver). Sin embargo, imprimirá un mensaje de depuración cuando esto suceda, así que esté atento a la ventana de Salida en Visual Studio.

Dado que DynamicResources trabaja con recursos que se cargan en cualquier punto y en cualquier orden, puede estructurar sus diccionarios de recursos de la forma que desee, para ponerlos con sus otros estilos de Vista y fusionarlos mediante la única aplicación. Recursos ResourceDictionary en app.xaml funcionará bien.

Se pueden encontrar más detalles sobre DynamicResources en los documentos de MSDN para WPF.

+0

siempre me pregunté sobre esto yo mismo, gracias por la respuesta, nunca llegué lo suficientemente lejos en WPF más allá de unos pocos applets ... por cierto, ¿cómo se conecta en cascada viewmodels dependientes? ¿tiene simplemente un "modelo de vista de aplicación" o tiene un "modelo de vista maestra" con "modelo de vista de niño" con "modelo de vista de descendiente" – Firoso

+0

Normalmente, tiene un modelo de vista "maestra" y luego hace referencia a sus objetos de modelo y forma algunos jerarquía. Es un poco más complicado que eso, y depende en cierto modo de la estructura de los datos en su aplicación, pero esa es la versión corta –

+0

. Pero, ¿qué ocurre si desea que MonkeyText se use en todos los TextBlocks? En WPF normal puede declarar el estilo en App.xaml y gracias a TargetType funcionará en todos los TextBlocks. Pero al usar MVVM, parece que no funciona, a menos que declare DynamicResource en todos los controles. – Peter