2010-07-22 12 views
17

Teóricamente, creo que puedo definir Pinceles y colores, etc. en un archivo xaml y asignarlo a un button.background en C#. ¿Pero cómo hago eso? ¿Dónde pongo mi definición LinearGradientBrush así:Cómo definir y usar recursos en xaml para que se puedan usar en C#

<LinearGradientBrush x:Key="BlaBrush"> 
       <GradientStop Offset="0" Color="Red"/> 
       <GradientStop Offset="1" Color="Green"/> 
</LinearGradientBrush> 

Sólo ponerlo en varios lugares de los resultados de archivo XAML de mi ventana en varios mensajes de error:/

me encontré con esta pregunta aquí en stackoverflow: How to use a defined brush resource in XAML, from C# que explica una parte de ella, pero parece saber dónde hacer la definición de Brush.

También intenté agregar la plantilla shinyblue.xaml wpf a la aplicación y agregué <ResourceDictionary Source="ShinyBlue.xaml"/> a la aplicación.resources en app.xaml. Esto hace que todos mis botones se vuelvan azules instantáneamente, pero aún así, las "cosas" definidas en shinyblue.xaml como NormalBrush no son accesibles desde C#, al menos no sé cómo.

Marc

+1

Me gustaría seleccionar todas sus publicaciones como respuestas, pero no puedo: D Gracias por toda esa información. Me ayuda mucho. – marc40000

Respuesta

17

Su xaml sería algo como esto:

MainWindow.xaml

<Window x:Class="BrushResource.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.Resources> 
    <LinearGradientBrush x:Key="BrushOne" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5"> 
     <LinearGradientBrush.GradientStops> 
      <GradientStopCollection> 
       <GradientStop Color="Black" Offset="0" /> 
       <GradientStop Color="Silver" Offset="1" /> 
      </GradientStopCollection> 
     </LinearGradientBrush.GradientStops> 
    </LinearGradientBrush> 

    <LinearGradientBrush x:Key="BrushTwo" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5"> 
     <LinearGradientBrush.GradientStops> 
      <GradientStopCollection> 
       <GradientStop Color="Maroon" Offset="0" /> 
       <GradientStop Color="Silver" Offset="1" /> 
      </GradientStopCollection> 
     </LinearGradientBrush.GradientStops> 
    </LinearGradientBrush> 
</Window.Resources> 

<StackPanel> 
    <Button Content="Button" Width="100" Click="myButton_Click"/> 
</StackPanel> 

Para asignar el valor, tiene que agarrar el pincel de degradado de los recursos de este tipo:

MainWindow.xaml.cs

private void myButton_Click(object sender, RoutedEventArgs e) 
    { 
     (sender as Button).Background = this.Resources["BrushOne"] as LinearGradientBrush; 
    } 
+0

Esto también funciona en WinRT XAML. – dex3703

13

Póngalos en la Colección de Recursos de uno de sus elementos en XAML:

<Window ...> 
    <Window.Resources> 
     <LinearGradientBrush x:Key="BlaBrush"> 
      <GradientStop Offset="0" Color="Red"/> 
      <GradientStop Offset="1" Color="Green"/> 
     </LinearGradientBrush> 
     <!-- Other resources --> 
    </Window.Resources> 
    <!-- Contents of window --> 
</Window> 

a continuación, obtener en código utilizando FindResource

var blaBrush = this.FindResource("BlaBrush") as LinearGradientBrush; 

Ver Resources Overview para más información .

7

Se puede acceder a los recursos de la aplicación como

Application.Current.Resources["BlaBrush"] as LinearGradientBrush 

O, se agrega el recurso a los recursos del control y acceder a ellos como Quartermeister escribió.

14

Tenga en cuenta que las respuestas existentes hablan de poner los recursos en Window.Resources. Si desea que los recursos estén disponibles para toda la aplicación, puede considerar ponerlos en App.xaml o mejor aún, crear diccionarios de recursos independientes que se puedan incluir en sus vistas y reutilizar en otros lugares (incluidos otros proyectos)

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="DefaultStyles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     <Style x:Key="my_style" /> 
    </ResourceDictionary> 
</UserControl.Resources> 
+0

¿Cómo hago eso? Cuando trato de agregar más de una líneas a Application.Resources en xaml, aparece un error que dice que ya está definido. Ponerlo en windows.resources es algo similar. Cuando agrego mi propio archivo xaml allí, de alguna manera se olvida de las "cosas" definidas en shinyblue.xaml? – marc40000

+0

@ marc40000: ver mis ediciones. –

Cuestiones relacionadas