最好远离另一个进程动画窗口的位置,正弦缓动?
Posted
技术标签:
【中文标题】最好远离另一个进程动画窗口的位置,正弦缓动?【英文标题】:Best away to animate the position of the window from another process, with Sine easing? 【发布时间】:2011-06-16 19:27:31 【问题描述】:我需要为其他进程的窗口位置设置动画。有什么方法可以通过使用 Sine、Quad、Quart 甚至 Back easing 的平滑动画来实现这一点?
【问题讨论】:
【参考方案1】:假设您正在谈论 WPF,那么定位动画和缓动功能可能最好使用 xaml 情节提要动画来处理。
更大的问题是从另一个进程中获得对应用程序或控件的控制权。假设您有两个应用程序的代码,那么实现某种进程间通信并让拥有进程重新定位它自己的元素会更容易。 NamedPipeServerStream 和 NamedPipeClientStream 可以让您发送/接收重新定位请求。
否则,您可能希望通过 AutomationPeers 研究 UI 自动化。
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();
您可以轻松触发动画,或者有两个带有移动坐标的文本框。
【讨论】:
但是实现这样的功能不需要某种互操作包装器吗?我打算使用以下 user32 函数来实现它,但我不知道性能是否会成为问题:pinvoke.net/default.aspx/user32.MoveWindow 只有*** WPF 控件具有窗口句柄。您将无法使用 MoveWindow 控制子控件。 嗯,这不是我想要动画的按钮。谢谢你之前的文章。我正在开发一个 WPF 应用程序,它将使用 Windows 为所有正在运行的进程的位置设置动画。我正在尝试确定使用 Sine 缓动为所有正在运行的窗口设置动画的可能性。以上是关于最好远离另一个进程动画窗口的位置,正弦缓动?的主要内容,如果未能解决你的问题,请参考以下文章