Лучше всего анимировать положение окна из другого процесса, с синусоидальным смягчением? - PullRequest
0 голосов
/ 27 января 2011

Мне нужно анимировать положение окон от других процессов.Есть ли способ добиться этого с помощью плавной анимации, используя Sine, Quad, Quart или даже Back back?

1 Ответ

0 голосов
/ 28 января 2011

Если вы говорите о WPF, то анимация позиционирования и функции ослабления, вероятно, лучше всего будут обрабатываться с помощью анимации раскадровки xaml.

Большим вопросом будет получение контроля над приложением или элементами управления от другогопроцесс.Предполагая, что у вас есть код для обоих приложений, было бы легче реализовать какую-то межпроцессную связь и позволить собственному процессу переместить свои собственные элементы.NamedPipeServerStream и NamedPipeClientStream позволят вам отправить / получить запрос на изменение местоположения.

В противном случае вы можете захотеть посмотреть на автоматизацию пользовательского интерфейса через AutomationPeers.

http://msdn.microsoft.com/en-us/library/ms747327(v=VS.85).aspx


Введите в приложении следующий xaml:

<Grid>
    <Button Name="btnOne" Content="this is test button">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="Margin" Value="20" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=PositionCheck,Path=IsChecked}" Value="True" >
                        <Setter Property="Margin" Value="-150,20,150,20" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    <CheckBox Content="CheckBox" Name="PositionCheck" Visibility="Collapsed" AutomationProperties.AutomationId="chkToggle" VerticalAlignment="Top" />
</Grid>

Вы можете сделать так, чтобы кнопка перепрыгивала из другого приложения, например так:

        Process p = Process.GetProcessesByName("ProjectWithButton").FirstOrDefault();
        if (p != null)
        {
            AutomationElement ele = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ProcessIdProperty, p.Id));
            if (ele != null)
            {
                AutomationElement chk= ele.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "chkToggle"));
                TogglePattern toggle = chk.GetCurrentPattern(TogglePattern.Pattern) as TogglePattern;
                System.Diagnostics.Debug.WriteLine(toggle.Current.ToggleState);
                toggle.Toggle();
            }
        }

Вы также можете легко запускать анимацию,или иметь два текстовых поля с координатами для движения.

...