OpenFileDialog在WPF中保存背景

时间:2011-07-28 07:00:19

标签: .net wpf background openfiledialog

我有一个调用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();
        }

    }
}

2 个答案:

答案 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;
        }
    }