2009-06-09 21 views
6

he encontrado algo sobre este tema para ASP, pero no me ayuda mucho ...C# Control de usuario que pueden contener otros controles (cuando se utiliza)

Lo que me gustaría hacer es la siguiente : Deseo crear un control de usuario que tenga una colección como propiedad y botones para navegar a través de esta colección. Quiero poder vincular este control de usuario a una colección y mostrar diferentes controles en él (que contienen datos de esa colección). Al igual que lo que tenía en MS Access en el borde inferior de una forma ...

para ser más precisos:

Cuando utilizo realmente el control en mi solicitud (después de lo creé), quiero ser capaz de agregarle múltiples controles (cuadros de texto, etiquetas, etc.) entre <myControly> y </mycontrol> Si lo hago ahora, los controles en mi control de usuario desaparecerán.

+2

cuál es el problema? Esto suena muy fácil de hacer ... – Tony

+0

El problema no es la colección y los botones de navegación, sino lo que quiero poder agregar controles al Control de usuario cuando lo uso en otra aplicación. –

+0

Si trato de poner controles múltiples entre y hay un error que puedo poner solo un control allí. Si intento una grilla, los controles en mi control personalizado desaparecen. –

Respuesta

8

Aquí es un ejemplo de una forma de hacer lo que quiera:

En primer lugar, el código - UserControl1.xaml.cs

public partial class UserControl1 : UserControl 
{ 
    public static readonly DependencyProperty MyContentProperty = 
     DependencyProperty.Register("MyContent", typeof(object), typeof(UserControl1)); 


    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    public object MyContent 
    { 
     get { return GetValue(MyContentProperty); } 
     set { SetValue(MyContentProperty, value); } 
    } 
} 

Y XAML del control de usuario - UserControl1.xaml

<UserControl x:Class="InCtrl.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300" Width="300" Name="MyCtrl"> 
    <StackPanel> 
     <Button Content="Up"/> 
     <ContentPresenter Content="{Binding ElementName=MyCtrl, Path=MyContent}"/> 
     <Button Content="Down"/> 
    </StackPanel> 
</UserControl> 

Y, por último, el XAML para utilizar nuestro maravilloso control de nuevo:

<Window x:Class="InCtrl.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:me="clr-namespace:InCtrl" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <me:UserControl1> 
      <me:UserControl1.MyContent> 
       <Button Content="Middle"/> 
      </me:UserControl1.MyContent> 
     </me:UserControl1> 
    </Grid> 
</Window> 
+0

@Nir +1 Estaba jugando con esta misma solución, pero no conseguí que funcionara. Faltaba el enlace en la propiedad de contenido del presentador de contenido. – JMarsch

+0

también considere este hilo: http://stackoverflow.com/questions/1017421/access-like-data-navigation-in-wpf esta es la solución que finalmente implementé. Ni siquiera es necesario que el control contenga otros controles como noté. –

0

Un UserControl puede no ser la mejor manera de hacerlo. Está deseando agregar decoraciones alrededor del contenido, que es básicamente lo que hace Border: tiene un elemento hijo y agrega sus propias cosas alrededor de los bordes.

Mire en la clase de decorador, de la que desciende el borde. Si crea su propio descendiente de frontera, debe poder hacer lo que quiera con facilidad. Sin embargo, creo que esto requeriría escribir código, no XAML.

Es posible que desee hacer un UserControl para ajustar los botones en la parte inferior, solo para que pueda usar el diseñador visual como parte del proceso. Pero el Decorador sería una buena forma de unir las piezas y permitir el contenido definible por el usuario.

1

Estoy teniendo dificultades para entender su pregunta, pero creo que lo que estás describiendo es un ItemsControl usando DataTemplates para mostrar el contenido de (supuestamente) un ObservableCollection(T).

+0

Su respuesta es más exactamente lo que necesitaba (creo), pero la solución de Nirs hace más exactamente lo que describí anteriormente. Como solo una respuesta es posible, marqué la suya. Pero actualmente estoy evaluando qué puede hacer un control de Elementos y parece que es más o menos lo que tenía en mente (con algunas personalizaciones). ¡Gracias! –

0

Aquí hay una link a un control integrado (HeaderedContentControl) que hace lo mismo que la respuesta aceptada, excepto que es un control existente en WPF desde .Net 3.0

Cuestiones relacionadas