2009-06-09 15 views
6

znalazłem coś o tym problemie na ASP, ale to mi nie pomogło ...C# kontrola użytkownika, które mogą zawierać inne elementy sterujące (podczas używania go)

Co chciałbym zrobić jest następujący : Chcę utworzyć formant użytkownika, który ma kolekcję jako właściwość i przyciski do poruszania się po tej kolekcji. Chcę móc powiązać tę kontrolę użytkownika z kolekcją i wyświetlić różne kontrolki (zawierające dane z tej kolekcji). Podobnie jak to, co miał w MS Access na dolnej krawędzi formie ...

dokładniej:

Kiedy faktycznie korzysta z kontroli w mojej aplikacji (po tym jak stworzył go), chcę być w stanie dodać do niego wiele elementów sterujących (pola tekstowe, etykiety itp.) pomiędzy <myControly> i </mycontrol> Jeśli zrobię to teraz, kontrolki na mojej kontroli użytkownika znikną.

+2

co ten problem? To brzmi bardzo łatwo ... – Tony

+0

Problem nie jest zbiorem i przyciskami nawigacyjnymi, ale rzeczą, którą chcę móc dodać do kontroli użytkownika, gdy używam go w innej aplikacji. –

+0

Jeśli spróbuję umieścić wiele elementów sterujących między i, jest błąd, że mogę tam umieścić tylko jedną kontrolkę. Jeśli spróbuję siatki, kontrolki kontrolki niestandardowej znikną. –

Odpowiedz

8

Oto przykład jeden sposób, aby robić to, co chcesz:

Najpierw kod - 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); } 
    } 
} 

I XAML kontrolki autora - 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> 

I wreszcie, XAML do korzystania z naszego wspaniałego nowego sterowania:

<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 Grałem około z tego samego rozwiązania, ale nie mogłem dostać pracy - Brakowało mi Binding na właściwości content Zawartość prezentera. – JMarsch

+0

również rozważyć ten wątek: http://stackoverflow.com/questions/1017421/access-like-data-navigation-in-wpf jest to rozwiązanie w końcu realizowane. Nie jest nawet konieczne, aby kontrolka zawierała inne elementy sterujące, co zauważyłem. –

0

UserControl może nie być najlepszym sposobem na zrobienie tego. Chcesz dodawać dekoracje wokół treści, co jest w zasadzie tym, co robi Border: ma element potomny i dodaje własne elementy wokół krawędzi.

Sprawdź klasę dekoratora, z której pochodzi granica. Jeśli stworzysz własnego potomka na granicy, powinieneś być w stanie zrobić to, co chcesz. Uważam jednak, że wymagałoby to pisania kodu, a nie XAML.

Nadal możesz chcieć ustawić UserControl, aby owijał przyciski na dole, abyś mógł użyć wizualnego projektanta jako części procesu. Ale Dekorator byłby dobrym sposobem na sklejenie elementów i umożliwienie definiowania przez użytkownika treści.

1

Mam trudności ze zrozumieniem Twojego pytania, ale myślę, że to, co opisujesz, to ItemsControl używając DataTemplates do wyświetlenia zawartości (prawdopodobnie) ObservableCollection(T).

+0

Twoja odpowiedź jest bardziej dokładnie to, co potrzebne (wierzę), ale rozwiązanie NIRS robi bardziej dokładnie, co opisałem powyżej. Ponieważ możliwa jest tylko jedna odpowiedź, zaznaczam jego. Ale jestem w trakcie oceny, co może zrobić Elementy sterowania i wydaje się, że ist dość dużo, co miałem na myśli (z kilkoma dostosowań). dzięki! –

0

Oto link do wbudowanego sterowania (HeaderedContentControl), który robi to samo, co zaakceptowanej odpowiedzi poza tym, że jest to istniejąca kontrola w WPF od .NET 3.0

Powiązane problemy