我有一个调用OpenFileDialog.ShowDialog的WPF应用程序。当此对话框打开时,我的应用程序可能会改变背景并显示新信息。
如果用户现在关闭此对话框,则会恢复背景,这意味着屏幕上会显示旧信息。
如何阻止OpenFileDialog保存它的背景?
或者,如果无法做到这一点,我该如何强制重新绘制我的应用程序?
示例代码,按下按钮并在文本上放置对话框:
<Window x:Class="BackgroundOfFileOpen.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="10*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Viewbox Grid.Row="0">
<Label Content="{Binding textInBackground}" />
</Viewbox>
<Button Grid.Row="1" Click="OnOpenDialog">Open Dialog</Button>
</Grid>
using Microsoft.Win32;
using System.Windows;
using System.Threading;
using System;
namespace BackgroundOfFileOpen
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public string textInBackground
{
get { return (string)GetValue(textInBackgroundProperty); }
set { SetValue(textInBackgroundProperty, value); }
}
// Using a DependencyProperty as the backing store for textInBackground. This enables animation, styling, binding, etc...
public static readonly DependencyProperty textInBackgroundProperty =
DependencyProperty.Register("textInBackground", typeof(string), typeof(MainWindow), new UIPropertyMetadata("Text"));
public MainWindow()
{
InitializeComponent();
DataContext = this;
function += ModifyText;
}
private void OnOpenDialog(object sender, RoutedEventArgs e)
{
Thread backgroundThread = new Thread(ThreadMethod);
backgroundThread.Start();
OpenFileDialog dlg = new OpenFileDialog();
dlg.ShowDialog();
}
public void ModifyText()
{
if (Dispatcher.CheckAccess())
{
textInBackground += "x";
}
else
{
Dispatcher.BeginInvoke(new Action(() => { ModifyText(); }));
}
}
delegate void ModifyFunction();
static ModifyFunction function;
static void ThreadMethod()
{
Thread.Sleep(1000);
function();
}
}
}
答案 0 :(得分:1)
如何强制重新绘制我的应用程序?
关闭对话框后,使用UIExtensions.Refresh(this);
public static class UIExtensions
{
public static void Refresh(this UIElement uiElement)
{
uiElement.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
}
}
答案 1 :(得分:0)
对于任何感兴趣的人,我现在发现的唯一解决方法是在ShowDialog之后调用以下函数。这不好,如果窗口最大化,它会闪烁,但它适用于所有经过测试的系统。
void RefreshWindow()
{
switch (WindowState)
{
case WindowState.Maximized:
{
double oldWidth = Width;
Width = System.Windows.SystemParameters.PrimaryScreenWidth - 1;
WindowState = System.Windows.WindowState.Normal;
WindowState = System.Windows.WindowState.Maximized;
Width = oldWidth;
}
break;
case WindowState.Normal:
if (Width > 1)
{
Width -= 1;
Width += 1;
}
else
{
Width += 1;
Width -= 1;
}
break;
case WindowState.Minimized:
default:
// no action necessary
break;
}
}