2011-07-28 16 views
0

私はOpenFileDialog.ShowDialogを呼び出すWPFアプリケーションを持っています。このダイアログが開いている間、私のアプリケーションが背景を変更し、新しい情報を表示する可能性があり、期待される動作です。OpenFileDialog 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

おそらく、クリアするためにコードを共有する必要があります。 –

+0

サンプルコードを元の投稿 – MTR

答えて

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; 
     } 
    } 
+0

MTR - 回避策があれば答えとして受け入れてください – MikroDel

1

どのように私は自分のアプリケーションの再描画を強制することができますか?

興味を持っている誰のためにダイアログを使用 UIExtensions.Refresh(this);

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

に追加しました。ShowDialog()の後のthis.Refresh()は役に立ちません – MTR

+0

ウィンドウ全体ではなくラベルでRefreshを呼び出すと、私のために働いてくれました。 ViewBoxを削除したときに問題は見られなかったので、ViewBoxとは何か関係があります。 – IanR

+0

それは私のためには機能しません。あなたはどのような環境を持っていますか?私はWindows XPで.NET Framwork 4を使用しています。これはシェルダイアログであるため、この問題はWindows XPでのみ発生すると思われます。 – MTR

関連する問題