UWP用户控件公开内部StackPanel

时间:2016-06-06 09:31:04

标签: controls uwp internal

我是UWP的新手,他是一名习惯使用Windows窗体的开发人员。 在Windows窗体中我正在尝试做的事情,我很容易通过表单继承。 UWP似乎没有任何形式的布局继承,看来你必须设计一个UserControl来实现它,然后将它放在页面上并用控件填充页面。

我有一个包含2列网格的控件。在第一列中,我放置了一个StackPanel,此时第二列是空的。

<UserControl x:Name="userControl"
    x:Class="App1.BaseLayoutControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">

   <Grid>
       <Grid.ColumnDefinitions>
           <ColumnDefinition Width="11*"/>
           <ColumnDefinition Width="29*"/>
       </Grid.ColumnDefinitions>
       <StackPanel Margin="0" Background="#FF0B1E70"/>
   </Grid>
</UserControl>

代码:

using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using App1.Annotations;

// The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236

namespace App1
{
    public sealed partial class BaseLayoutControl : INotifyPropertyChanged
    {
        public BaseLayoutControl()
        {
            InitializeComponent();
        }

        public StackPanel LeftStackPanel
        {
            get { return ( StackPanel ) GetValue( LeftStackPanelProperty ); }
            set
            {
                SetValue( LeftStackPanelProperty, value );
                OnPropertyChanged( nameof( LeftStackPanel ) );
            }
        }

        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty LeftStackPanelProperty =
            DependencyProperty.Register( "LeftStackPanel", typeof( StackPanel ), typeof( BaseLayoutControl ), null );

        public event PropertyChangedEventHandler PropertyChanged;

        [ NotifyPropertyChangedInvocator ]
        private void OnPropertyChanged( [ CallerMemberName ] string propertyName = null )
        {
            PropertyChanged?.Invoke( this, new PropertyChangedEventArgs( propertyName ) );
        }
    }
}

现在我要做的是将StackPanel暴露为属性“LeftStackPanel”,并且在设计时我将控件放在页面上我希望能够将按钮,CheckBoxes,Text等拖放到控件内的StackPanel。另外,我想公开第二个未使用的网格列,以便项目也可以放在其中。

我能找到的所有示例似乎只处理简单的对象类型,如整数和字符串。

任何帮助表示赞赏。 特里

1 个答案:

答案 0 :(得分:0)

从WinForms迁移到XAML时,这是一个长期的挑战。

简短的回答是,您应该考虑创建 CustomControl 而不是 UserControl

UserControl 是一个自包含的UI元素,您可以提供数据并显示它。

如果您不仅需要自定义显示的信息,还需要自定义显示信息的方式,则需要使用 CustomControl 。这将启用您尝试在您的案例中实现的方案。

Here是一个关于如何编写第一个CustomControl的非常好的可视化教程。此外,有关用户和自定义控件之间差异的模式详细信息,请检查this帖子。事实上,关于这个主题有很多文章和教程。其中大部分来自WPF日,但一切仍然适用于UWP。