我正在编写一个GDI和WPF的示例应用程序。我有一个WPF窗口,其中有一个带有点击处理程序的按钮,其中包含以下正文:
this.DialogResult = true;
这会关闭WPF对话框。但是,关闭此对话框时,Windows 7 / Vista上没有“淡入淡出”效果。或者,使用GDI窗口,淡入淡出。我要么做错了,要么这是关闭WPF窗口时的默认行为。此外,使用X按钮关闭会执行相同的不需要的行为。
理想情况下,我希望两种类型的窗口都以相同的风格关闭。有人遇到过这种情况么?对于我的WPF窗口的所有,这是否很容易修复?
编辑:好的,所以我发现了一些非常有趣的东西。当要关闭的窗口不超过父窗口(例如,它移动到另一台显示器)并关闭时,通常的淡入淡出正确!但是,如果要关闭的窗口超过父窗口,则不会出现淡入淡出。可爱!
答案 0 :(得分:0)
如果您的窗口没有边框,
<Window
xmlns="blahblahblah"
AllowsTransparency="True" WindowStyle="None">
你可以将淡入淡出的动画变为透明,并编写一个调用动画然后完成关闭的关闭事件处理程序。如果窗口有边框,我很确定边框会留在那里看起来很奇怪。
答案 1 :(得分:0)
我已经提出了一个解决方案,虽然我认为它仍然相当实际上已经淡出工作的黑客。我还使用纯WPF应用程序进行了测试,当不与其父窗口重叠时,窗口仍然只会淡出。如果有人有比下面的代码更好的解决方案,请告诉我!
public class WindowBase : Window
{
private bool hasFadeCompleted = false;
protected override void OnClosing(CancelEventArgs e)
{
if (this.hasFadeCompleted)
{
base.OnClosing(e);
return;
}
e.Cancel = true;
var hWnd = new WindowInteropHelper(this).Handle;
User32.AnimateWindow(hWnd, 1, AnimateWindowFlags.AW_BLEND | AnimateWindowFlags.AW_HIDE);
Task.Factory.StartNew(() =>
{
this.Dispatcher.Invoke(new Action(() =>
{
this.hasFadeCompleted = true;
this.Close();
}), DispatcherPriority.Normal);
});
}
}
public static class User32
{
[DllImport("user32.dll")]
public static extern bool AnimateWindow(IntPtr hWnd, int time, uint flags);
}
public static class AnimateWindowFlags
{
public const uint AW_HOR_POSITIVE = 0x00000001;
public const uint AW_HOR_NEGATIVE = 0x00000002;
public const uint AW_VER_POSITIVE = 0x00000004;
public const uint AW_VER_NEGATIVE = 0x00000008;
public const uint AW_CENTER = 0x00000010;
public const uint AW_HIDE = 0x00010000;
public const uint AW_ACTIVATE = 0x00020000;
public const uint AW_SLIDE = 0x00040000;
public const uint AW_BLEND = 0x00080000;
}
我仍然感到惊讶,这对任何其他人来说都不是问题。