Отделение и восстановление элементов из TransformGroup в Silverlight - PullRequest
0 голосов
/ 13 ноября 2010

На моем MainPage.xaml у меня есть несколько пользовательских элементов управления, которые я хочу иметь возможность перемещаться по всей поверхности сетки. Вот почему я добавляю их всех в 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;

Теперь я могу переместить все свои пользовательские элементы управления, что дает мне «эффект прокрутки» в Grid (что-то вроде прокрутки эффекта Bing Maps).

Моя проблема: Я хочу иметь возможность отделить свой пользовательский элемент управления от 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» в Grid, если ни один не выбран, или выбрать только один, если какой-либо выбран?

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 13 ноября 2010

Вы должны создать отдельную TransformGroupd для каждого пользовательского элемента управления.Возможно, вы захотите иметь контейнерный элемент управления, в который вы добавите все пользовательские элементы управления со своей собственной группой TransformGroup. Эта группа преобразований будет влиять на все элементы управления, в то время как индивидуальная группа преобразований для каждого элемента управления используется для воздействия на отдельные элементы управления.

Возможно, вытакже подумайте о том, чтобы соединить все это вместе непосредственно в XAML.

Таким образом, MainPage может иметь сетку макета с дочерней сеткой, которая действует как контейнер для всех элементов управления, это то, что будет переведено и масштабировано для воздействия на все элементы.дочерние элементы управления.

<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, каждый со своим собственным преобразованием «Трансляция» и «Масштаб».Дочерний элемент управления может выглядеть примерно так.

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

Код, приведенный ниже, может предоставлять некоторые свойства, к которым вы можете получить доступ, чтобы повлиять на преобразование и масштабирование элементов управления Entity.

...