Как использовать содержимое производных элементов управления в Silverlight - PullRequest
0 голосов
/ 08 декабря 2011

В моем проекте много просмотров должно иметь кнопку «ОК», кнопку «Отмена» в нижней части окна.Поэтому я хочу создать базовый контроль.И добавьте кнопку Ok, Cancel в нижнюю часть этого элемента управления.Тогда я унаследую этот контроль.В унаследованном элементе управления я хочу добавить текстовое поле рядом с этими кнопками.Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 08 декабря 2011

Вы можете создать элемент управления, который наследуется от ContentControl, и определить свои кнопки в ControlTemplate этого.Тогда вы можете просто использовать этот элемент управления, как показано в примере.ControlWithButtons.cs

[TemplatePart(Name="btnOk", Type= typeof(Button))]
public class ControlWithButtons : ContentControl
{
    public ControlWithButtons()
    {
        this.DefaultStyleKey = typeof(ControlWithButtons);
    }

    Button _btnOk;

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        _btnOk =  GetTemplateChild("btnOk") as Button;
        if (_btnOk != null)
        { 
            // do what you want with you button
            _btnOk.Click += new RoutedEventHandler(_btnOk_Click);
        }
    }

    void _btnOk_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Ok button clicked");
    }
}

Generic.xaml (должен быть в (ProjectDir) /Themes/Generic.xaml) (не забудьте xmlns: local = "clr-namespace: Test")

<Style TargetType="local:ControlWithButtons">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ControlWithButtons">
                <Border Background="Yellow" CornerRadius="5">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="30"/>
                        </Grid.RowDefinitions>
                        <Border Margin="10" Background="LightGray">
                            <ContentPresenter/>
                        </Border>
                        <Button Grid.Row="1" x:Name="btnOk" Content="OK" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="5"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Используя ваш контроль:

<Grid x:Name="LayoutRoot" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <local:ControlWithButtons Width="300" Height="250" HorizontalAlignment="Center" VerticalAlignment="Center">

        <!-- TextBox is put into control -->
        <TextBox Width="200" Height="Auto" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="5" />

        <!-- You can also specify ContentTemplate for ControlWithButtons  -->
        <!-- (see in MSDN "http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplate(v=vs.95).aspx") -->

    </local:ControlWithButtons>
</Grid>
0 голосов
/ 12 декабря 2011

Я нашел решение. [ContentProperty("")] атрибут решил мою проблему.
Как это:

Base Xaml

    <Grid Name="layoutRoot" VerticalAlignment="Stretch"  >
        <Grid.RowDefinitions>
            <RowDefinition Height="289*" />
            <RowDefinition Height="51" />
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="1" Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Orientation="Horizontal">
            <Button Name="btnOk" Content="Ok" Height="23"  Width="75"  HorizontalAlignment="Left" Margin="10,10,10,10"  Command="{Binding Path=OnApply, Mode=OneWay}"/>
            <Button Name="btnCancel" Content="Cancel" Height="23"  Width="75"  HorizontalAlignment="Left" Margin="10,10,10,10"/>
        </StackPanel>
        <Grid Name="rootContent" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Column="0" Grid.Row="0" />
    </Grid>
</sdk:ChildWindow>

Базовый CodeBehind

[ContentProperty("RootContentControl")]//This attribute solved my problem.
public partial class BaseView : ChildWindow
{

    public BaseView()
    {
        InitializeComponent();
    }

    public UIElementCollection RootContentControl
    {
        get { return rootContent.Children; }
    }
}

Унаследованный Xaml

<Views:BaseView x:Class="MvvmLight1.Views.InheritedView"
             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"
             xmlns:Views="clr-namespace:MvvmLight1.Views" 
                xmlns:viewModels="clr-namespace:MvvmLight1.ViewModel"                
                mc:Ignorable="d" d:DesignHeight="244" d:DesignWidth="392"
                DataContext="{Binding Source=viewModels:InheritedViewModel}">
    <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</Views:BaseView>

Унаследованный CodeBehind

public partial class InheritedView : BaseView
{
    public InheritedView()
    {
        InitializeComponent();
    }
}
0 голосов
/ 08 декабря 2011

Я считаю, что есть шаблон для базового элемента управления. Поэтому в шаблоне унаследованного элемента управления отредактируйте панель кнопок и добавьте текстовое поле.

...