tutorial - wpf vs winforms
¿Es posible establecer un código detrás de un diccionario de recursos en WPF para el manejo de eventos? (4)
¿Es posible establecer código detrás de un diccionario de recursos en WPF? Por ejemplo, en un control de usuario para un botón lo declaras en XAML. El código de manejo de eventos para el clic del botón se hace en el archivo de código detrás del control. Si tuviera que crear una plantilla de datos con un botón, ¿cómo puedo escribir el código del controlador de eventos para que haga clic en el diccionario de recursos?
Creo que lo que estás preguntando es si quieres un archivo de código subyacente para un ResourceDictionary. ¡Puedes hacer esto por completo! De hecho, lo haces de la misma manera que para una ventana:
Digamos que tiene un ResourceDictionary llamado MyResourceDictionary. En su archivo MyResourceDictionary.xaml, coloque el atributo x: Class en el elemento raíz, así:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyCompany.MyProject.MyResourceDictionary"
x:ClassModifier="public">
A continuación, cree un código detrás del archivo llamado MyResourceDictionary.xaml.cs con la siguiente declaración:
namespace MyCompany.MyProject
{
partial class MyResourceDictionary : ResourceDictionary
{
public MyResourceDictionary()
{
InitializeComponent();
}
... // event handlers ahead..
}
}
Y tu estas listo. Puede poner lo que desee en el código: métodos, propiedades y controladores de eventos.
== Actualización para aplicaciones de Windows 10 ==
Y, por si acaso estás jugando con UWP, hay una cosa más a tener en cuenta:
<Application x:Class="SampleProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:rd="using:MyCompany.MyProject">
<!-- no need in x:ClassModifier="public" in the header above -->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- This will NOT work -->
<!-- <ResourceDictionary Source="/MyResourceDictionary.xaml" />-->
<!-- Create instance of your custom dictionary instead of the above source reference -->
<rd:MyResourceDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Gishu: si bien esto podría parecer una "práctica generalmente no recomendada" Esta es una de las razones por las que quizás quieras hacerlo:
El comportamiento estándar de los cuadros de texto cuando se enfocan es que el cursor se coloque en la misma posición que cuando el control perdió el foco. Si prefiere en toda su aplicación, cuando el usuario hace pestañas en cualquier cuadro de texto que indica que todo el contenido del cuadro de texto fue resaltado, agregar un simple manejador en el diccionario de recursos haría el truco.
Cualquier otra razón por la que desee que el comportamiento de interacción del usuario predeterminado sea diferente del comportamiento fuera de la caja parece ser un buen candidato para un código subyacente en un diccionario de recursos.
Totalmente de acuerdo en que todo lo que sea específico de la aplicación no debe estar en un código subyacente de un diccionario de recursos.
No estoy de acuerdo con "ageektrapped" ... usar el método de una clase parcial no es una buena práctica. ¿Cuál sería el propósito de separar el diccionario de la página?
Desde un código subyacente, puede acceder a ax: Elemento de nombre usando:
Button myButton = this.GetTemplateChild("ButtonName") as Button;
if(myButton != null){
...
}
Puede hacer this en el método OnApplyTemplate si desea conectar los controles cuando se carga su control personalizado. OnApplyTemplate necesita ser anulado para hacer esto. Esta es una práctica común y permite que su estilo permanezca desconectado del control. (El estilo no debe depender del control, pero el control debe depender de tener un estilo).
XAML es para construir gráficos de objetos que no contienen código.
Una plantilla de datos se usa para indicar cómo se representará un usuario-objeto personalizado en la pantalla ... (por ejemplo, si se trata de un elemento de cuadro de lista) el comportamiento no forma parte del área de especialización de una plantilla de datos. Redibuja la solución ...