在Silverlight中从TransformGroup分离和恢复元素

时间:2010-11-13 11:23:25

标签: c# silverlight custom-controls

在我的MainPage.xaml上,我有一些自定义UserControls,我希望能够在整个Grid表面上移动。这就是我将它们全部添加到TransformGroup的原因:

            this.transformGroup = new TransformGroup();
            this.translation = new TranslateTransform();
            this.scale = new ScaleTransform();

            this.transformGroup.Children.Add(this.scale);
            this.transformGroup.Children.Add(this.translation);

            myCustomControl1.RenderTransform = this.transformGroup;
            myCustomControl2.RenderTransform = this.transformGroup;

现在,我可以移动所有自定义控件,这些控件在网格上提供了“滚动效果”(类似于滚动Bing地图效果)。

我的问题是: 我希望能够从TransformGroup中分离我的自定义控件,并将其独立于其他控件。在myCustomControl.xaml.cs中,我有:

private void separateControlFromTransformGroup()
    {
        Grid parentGrid = (Grid)Parent;
        this.transformGroup = (TransformGroup)this.RenderTransform;//backup copy of old transform group
        newTransformGroup1 = new TransformGroup(); //new temporary transform group
        TranslateTransform translation1 = new TranslateTransform();
        CopyTranslateTransform((TranslateTransform)transformGroup.Children[1], translation1);//copy the values of transformGroup from the MainPage.xaml to temporary one (not reference)
        ScaleTransform scale1 = new ScaleTransform();
        CopyScale((ScaleTransform)transformGroup.Children[0], scale1);

        newTransformGroup1.Children.Add(scale1);
        newTransformGroup1.Children.Add(translation1);
        foreach (myCustomControl brother in parentGrid.Children)
        {
            if (brother == this)
            {
                continue; (separate this control from the TransformGroup)
            }
            else
            {
                 brother.RenderTransform = newTransformGroup1; //the rest of myCustromControls on the Grid in MainPage.xaml now have diffrent transform group. Now I can move selected control independent from the rest

            }
        }
    }

移动单独的myCustomControl(使用新值)后,我无法将其与transformGroup中的其余部分连接,并且能够将所有内容一起移动。我该怎么办?如果没有选择,还有其他方法可以在网格上设置控件'moveAble',或者如果选择了任何一个,只选择一个?

请帮忙。

1 个答案:

答案 0 :(得分:0)

您应该为每个用户控件创建一个单独的TransformGroupd。您可能会考虑使用容器控件将所有用户控件添加到其自己的TransformGroup中,此转换组将影响所有控件,而每个控件转换组用于影响各个控件。

您也可以考虑直接在XAML中将这些连接在一起。

因此,MainPage可能具有带子Grid的布局Grid,它充当所有控件的容器,这将被翻译和缩放以影响所有子控件。

<UserControl x:Class="SilverlightApplication1.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"
    d:DesignHeight="300" d:DesignWidth="400">  
  <Grid x:Name="LayoutRoot" Background="White">
    <Grid x:Name="Container">
      <Grid.RenderTransform>
        <TransformGroup>
          <TranslateTransform x:Name="ContainerTranslation" />
          <ScaleTransform x:Name="ContainerScale" />
        </TransformGroup>
      </Grid.RenderTransform>
    </Grid>
  </Grid>
</UserControl>

然后可以将子控件添加到Constainer,每个控件都有自己的Translation和Scale转换。儿童控制可能是这样的。

<UserControl x:Class="SilverlightApplication1.EntityControl"
    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"
    d:DesignHeight="50" d:DesignWidth="50"
    Width="50" Height="50">
    <Grid x:Name="LayoutRoot" Background="White">
    <Grid.RenderTransform>
      <TransformGroup>
        <TranslateTransform x:Name="Translation" />
        <ScaleTransform x:Name="Scale" />
      </TransformGroup>      
    </Grid.RenderTransform>
    <Ellipse Stroke="Black" StrokeThickness="2" />
  </Grid>
</UserControl>

后面的代码可以暴露一些您可以访问的属性,以影响实体控件的翻译和缩放。