Как создать элементы управления из кода в пользовательском элементе управления? - PullRequest
1 голос
/ 20 октября 2010

В MainPage.xaml.cs (приложение Silverlight) я могу сделать что-то вроде этого:

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);

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

Обновление:

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

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";


    }
}

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

Надеюсь, это намного понятнее, чем вопрос, который был раньше.

Ответы [ 2 ]

1 голос
/ 21 октября 2010

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

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

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

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

0 голосов
/ 20 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...