【问题标题】:OpenFileDialog saving background in WPFWPF中的OpenFileDialog保存背景
【发布时间】:2011-07-28 07:00:19
【问题描述】:

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

    }
}

【问题讨论】:

  • 也许你应该分享一些代码来清除。
  • 在原始帖子中添加了示例代码

标签: .net wpf background openfiledialog


【解决方案1】:

如何强制重绘我的应用程序?

关闭对话框后使用UIExtensions.Refresh(this);

public static class UIExtensions
{
    public static void Refresh(this UIElement uiElement)
    {
        uiElement.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
    }
}

【讨论】:

  • this.Refresh() 在 ShowDialog() 之后没有帮助
  • 如果我在标签而不是整个窗口上调用 Refresh 对我有用。不过一定是和 ViewBox 有关系,因为我在移除 ViewBox 时没有看到问题!?
  • 它对我不起作用。你有什么环境?我在 Windows XP 中使用 .NET Framwork 4。由于这是一个 shell 对话框,我怀疑这个问题只发生在 Windows XP 上。
  • 这个问题在 Windows 7 下略有不同。只有当文本被对话框重叠一半时才会出现。
【解决方案2】:

对于任何感兴趣的人,我现在找到的唯一解决方法是在 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;
        }
    }

【讨论】:

  • MTR - 如果你的解决方法适合你 - 请接受它作为答案
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多