OpenFileDialog сохранение фона в WPF - PullRequest
0 голосов
/ 28 июля 2011

У меня есть приложение WPF, которое вызывает OpenFileDialog.ShowDialog. Пока этот диалог открыт, возможно и ожидается, что мое приложение изменит фон и отобразит новую информацию.

Если пользователь теперь закрывает это диалоговое окно, фон восстанавливается, что означает, что на экране имеется старая информация.

Как я могу предотвратить сохранение 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 ]

1 голос
/ 28 июля 2011

как я могу принудительно перекрасить мое приложение?

После закрытия диалога используйте UIExtensions.Refresh(this);

public static class UIExtensions
{
    public static void Refresh(this UIElement uiElement)
    {
        uiElement.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
    }
}
0 голосов
/ 29 июля 2011

Для всех, кто интересуется, единственный обходной путь, который я нашел к настоящему времени, - это вызвать следующую функцию после 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;
        }
    }
...