2010-10-20 3 views
1

В MainPage.xaml.cs (Silverlight Application), я могу сделать что-то вроде этого:Как создать элементы управления из кода в пользовательском элементе управления?

StackPanel myStackPanel = new StackPanel(); 

Button myButton = new Button(); 
myButton.Content = "Button"; 
myButton.Width = 200; 
myButton.Height = 30; 

Button myButton1 = new Button(); 
myButton1.Content = "Button 1"; 
myButton1.Width = 200; 
myButton1.Height = 30; 

myStackPanel.Children.Add(myButton); 
myStackPanel.Children.Add(myButton1); 

this.LayoutRoot.Children.Add(myStackPanel); 

Что является эквивалентом этого кода в пользовательский элемент управления, когда я пытаюсь создать эти элементы управления из кода?

Update:

Мой вопрос, вероятно, слишком запутанным. Я попробую лучшую формулировку. Итак, у меня есть

Generic.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:DemoAddControlLib"> 

    <Style TargetType="local:DemoControlShowtime"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:DemoControlShowtime"> 
        <Grid x:Name="LayoutRootControl"> 
         <Button x:Name="Button1" Content="Hi" Width="150" Height="30"></Button> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

И код:

DemoControlShowtime.cs

[TemplatePart(Name = "Button1", Type=typeof(Button))] 
public class DemoControlShowtime : Control 
{ 
    public DemoControlShowtime() 
    { 
     this.DefaultStyleKey = typeof(DemoControlShowtime); 
    } 

    // Events 
    public override void OnApplyTemplate() 
    { 
     Button1 = (Button)GetTemplateChild("Button1"); 
    } 

    private Button button1; 

    private Button Button1 
    { 
     get { return button1; } 
     set 
     { 
      if (button1 != null) 
      { 
       Button1.Click -= new RoutedEventHandler(myButton_Click); 
      } 

      button1 = value; 

      button1.Click += new RoutedEventHandler(myButton_Click); 
     } 
    } 

    void myButton_Click(object sender, RoutedEventArgs e) 
    { 
     Button1.Content = "Hello Button"; 


    } 
} 

Если я нажимаю на Button1 изменения контента из " Привет "на" Hello Button ". Я хочу, чтобы щелкнуть Button1, чтобы добавить StackPanel с двумя кнопками в качестве своих детей в Grid LayoutRootControl. Я знаю, что свойство Visibility и помещать его в xaml было бы проще, но мне любопытно, как это сделать из кода.

Надеюсь, это намного яснее, чем раньше.

+0

Не могли бы вы уточнить свой вопрос? Я не понимаю, что вы ищете. Вам интересно, как добавить CustomControl в myStackPanel? Или вам интересно, как сделать myStackPanel настраиваемым элементом управления, который вы добавляете в LayoutRoot? – JSprang

+0

Мне интересно, как добавить программный пакет StackPanel со своими дочерними элементами в свой пользовательский элемент управления (Silverlight Library) - например MyDemoControl.cs (здесь должен быть код с myStackPanel) + Generic.xaml. Может быть, я полностью решаю проблему. – nubm

+0

Итак, вы хотели бы сделать что-то вроде этого: у MyDemoControl есть кнопка и MyCustomControl, где MyCustomControl имеет что-то в ней (например, StackPanel)? – JSprang

ответ

1

Код на самом деле не отличается от того, что у вас есть.Единственное отличие состоит в том, что поле LayoutRoot не создано для вас.

Однако с этой строки кода: -

Grid LayoutRoot = GetTemplateChild("LayoutRootControl") as Grid; 

Остальная часть кода будет идентичным (хотя вы должны проверить, является ли LayoutRoot нулевым первым).

0

Мне кажется, что вам просто интересно, как использовать пользовательский элемент управления в нескольких местах.

Я создал пользовательский элемент управления (MyCustomControl), который имеет StackPanel, показанный в вашем коде, а затем использовал его несколько раз на MainPage.

MyCustomControl.xaml

<UserControl x:Class="SilverlightApplication2.MyCustomControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 

<StackPanel> 
    <Button Content="Button 1" Height="30" Width="200"/> 
    <Button Content="Button 2" Height="30" Width="200"/> 
</StackPanel> 

MyCustomControl.xaml.cs

public partial class MyCustomControl : UserControl 
{ 
    public MyCustomControl() 
    { 
     InitializeComponent(); 
    } 
} 

Затем я использовал этот пользовательский элемент управления дважды в главном окне.

MainPage.xaml

<UserControl x:Class="SilverlightApplication2.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
xmlns:local="clr-namespace:SilverlightApplication2" 
d:DesignHeight="300" d:DesignWidth="400"> 

<StackPanel> 
    <local:MyCustomControl Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    <local:MyCustomControl Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
</StackPanel> 

MainPage.xaml.cs

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 
} 

Выходные

alt text

+0

Спасибо @JSprang за ваши усилия и время, но мне пришлось обновить свой вопрос. Это было действительно странно. – nubm

Смежные вопросы