Lightswitch 2011 - 控制命令栏位置

时间:2013-09-17 08:45:27

标签: visual-studio-lightswitch

默认情况下,Lightswitch 2011会将控件的命令栏置于控制之下,如下图所示。

Default place of command bar

Hovewer,我想把这个命令栏放在控件的右边(下一张图片)。

enter image description here

这是怎么做到的?

您需要创建控制扩展,更准确地说,创建组控制扩展。因此,创建Lightswitch Extension Project,为该项目添加新的用户控件,例如“Control1”。

将此代码放在Common / Metadata / Controls / Control1.lsml

<Control Name="Control1" 
   SupportedContentItemKind="Group"
   AttachedLabelSupport="DisplayedByControl"
   DesignerImageResource="LightSwitchExtension11.Control1::ControlImage">

    <Control.Attributes>
       <DisplayName Value="Control1" />
    </Control.Attributes>
    <Control.Placeholders>
       <Placeholder DisplayName="Control" Name="ControlTemplate" />      
    </Control.Placeholders>  
</Control>

在控件的XAML中,我们可以使用水平方向的Stack Panel,它将包含一些控件,然后是命令栏。对于控件,我们使用ContentItemPresenter,将ContentItem属性绑定到第一个子项(在lsml文件中定义为Placeholder)。对于命令栏,我们使用CommandGroupPresenter。我们必须更新其边缘以获得良好的布局。

<UserControl x:Class="LightSwitchExtension11.Presentation.Controls.Control1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:framework ="clr-namespace:Microsoft.LightSwitch.Presentation.Framework;assembly=Microsoft.LightSwitch.Client">

    <StackPanel x:Name="rootControl" Orientation="Horizontal">

        <framework:ContentItemPresenter ContentItem="{Binding ChildItems[0]}" />

        <framework:CommandGroupPresenter Commands="{Binding CommandItems}" Margin="5, -3, 0, 0" VerticalContentAlignment="Center"/>

    </StackPanel>

</UserControl>

现在,我们有群组控制女巫可以显示一些控制,然后是命令栏。但是,默认命令栏(由Lightswitch添加)仍然可见。我们需要折叠这个命令栏。我们可以在后面的代码中完成它。因此,请将此代码添加到Control1.xaml.cs。

public Control1()
        {
            InitializeComponent();

            this.SetBinding(MyDataContextProperty, new Binding());

        }

        public object MyDataContext
        {
            get { return (object)GetValue(MyDataContextProperty); }
            set { SetValue(MyDataContextProperty, value); }
        }

        public static readonly DependencyProperty MyDataContextProperty =
            DependencyProperty.Register("MyDataContext", typeof(object), typeof(Control1), new PropertyMetadata(PropChanged));

        public static void PropChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            var container = VisualTreeHelper.GetParent(sender as UserControl);

            var containerParent = VisualTreeHelper.GetParent(container);

            var commandBar = containerParent.GetChildrenByType<CommandGroupPresenter>().FirstOrDefault();

            if (commandBar != null)
            {
                commandBar.Visibility = Visibility.Collapsed;
            }
        }

方法PropChanged很重要。在控件的DataContext被绑定之后调用此方法(因为构造函数中的SetBinding)。我们可以使用VisualTreeHelper.GetParent方法来获取控件,女巫应该包含默认命令栏(由Lightswitch添加)。要从此控件获取命令栏控件,我们可以使用扩展方法GetChildrenByType(see this)。如果存在命令栏,我们很容易将其折叠。

用法很简单。您添加新的组执行设计器。将Group的控制权改为Control1,将CONTROL占位符设置为某个控件,并将命令添加到命令栏,如下图所示。

enter image description here

希望,这对某人有帮助。

1 个答案:

答案 0 :(得分:1)

您需要做的就是添加一个空的 RowsLayout (或 ColumnsLayout )控件,就好像您要添加一个按钮一样。然后将命令从原始控件的命令拖到新组的命令

当你知道这个伎俩时,这很简单。