2017-05-29 15 views
0

私が取り組んでいるプロジェクトでは、リッチテキストボックス要素の内容をファイルにダンプするための保存ダイアログにアクセスするためのショートカットキーが必要です。WPFコマンドキーバインディングの問題

私のキーバインドとコマンドバインディングはXAMLで行われていますが、コードの背後には私が思っているものがあります。

私のキーとコマンドのバインドは、そうそうです。

<KeyBinding Command="local:customCommands.saveFile" Key="S" Modifiers="Ctrl"/> 
... 
<CommandBinding Command="local:customCommands.saveFile" Executed="launchSaveDialog"/> 

そして、これは、保存ダイアログにCtrl + Sを押しても表示されませんWPFウィンドウの背後

private void launchSaveDialog(object sender, ExecutedRoutedEventArgs e) 
    { 
     SaveFileDialog dlg = new SaveFileDialog(); 
     dlg.Filter = "Rich Text format(*.rtf)|*.rtf|"; 
     dlg.DefaultExt = ".rtf"; 
     dlg.OverwritePrompt = true; 
     if (dlg.ShowDialog() == true) 
     { 
      FileStream fileStream = new FileStream(dlg.FileName, FileMode.Create); 
      TextRange range = new TextRange(RTB.Document.ContentStart, RTB.Document.ContentEnd); 
      range.Save(fileStream, DataFormats.Rtf); 
     } 
    } 

コードです。 役立つ場合は、プログラムはフルスクリーンで実行されます。

また、Winformsのを実行する方法があるがSaveFileDialogは、フィルタ文字列についての例外をスローするまで、これが私にとって最初の試み(少なくともアップに取り組みました別ウィンドウでWPFアプリの内部で

+0

XAMLで定義されているKeyBindingとCommandBindingはどこにありますか? 'launchSaveDialog'にブレークポイントを置くことで、' launchSaveDialog'を呼び出すかどうかを調べることができます。 –

+0

あなたは間違いなく 'launchSaveDialog'を呼び出していません。そうでないと無効なフィルタ文字列に関する例外が表示されます。末尾のパイプ( '|')文字を削除する必要があります。 –

答えて

0

をダイアログを保存しました)。私はをWindow.InputBindingsに、CommandBindingWindow.CommandBindingsに入れました。

<Window 
    x:Class="Test3.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Test3" 
    xmlns:commands="clr-namespace:Commands" 
    Title="MainWindow" 
    Height="350" 
    Width="525"> 
    <Window.InputBindings> 
     <KeyBinding Command="local:customCommands.saveFile" Key="S" Modifiers="Ctrl"/> 
    </Window.InputBindings> 
    <Window.CommandBindings> 
     <CommandBinding Command="local:customCommands.saveFile" Executed="launchSaveDialog"/> 
    </Window.CommandBindings> 
    <Grid> 
     <RichTextBox x:Name="RTB" /> 
    </Grid> 
</Window> 

次のように私はcustomCommands定義:

public static class customCommands 
{ 
    static customCommands() 
    { 
     saveFile = new RoutedCommand("saveFile", typeof(MainWindow)); 
    } 
    public static RoutedCommand saveFile { get; private set; } 
} 

を私は末尾のパイプ文字によるフィルタ文字列に関する例外が発生しました。セパレータとして、ターミネータではないと考えられます。

指定されたフィルタ文字列は無効です。フィルタ文字列にはフィルタの説明が含まれ、その後に垂直バーとフィルタパターンが続きます。また、複数のフィルタ記述とパターンのペアを縦棒で区切る必要があります。フィルタパターン内の複数の拡張子をセミコロンで区切る必要があります。例: ";(。)。画像ファイル(* .BMP、の.jpg)| | .bmpの.jpgのすべてのファイル| *"

簡単修正:

private void launchSaveDialog(object sender, ExecutedRoutedEventArgs e) 
{ 
    SaveFileDialog dlg = new SaveFileDialog(); 
    dlg.Filter = "Rich Text format (*.rtf)|*.rtf"; 
    dlg.DefaultExt = ".rtf"; 
    dlg.OverwritePrompt = true; 
    if (dlg.ShowDialog() == true) 
    { 
     FileStream fileStream = new FileStream(dlg.FileName, FileMode.Create); 
     TextRange range = new TextRange(RTB.Document.ContentStart, RTB.Document.ContentEnd); 
     range.Save(fileStream, DataFormats.Rtf); 
    } 
} 

キーボード入力をどこかで食べている可能性がありますが、そのコードを表示していないので、ただそこに投げているだけです。

javaCase名の主張は比較的無害ですが、読みやすくするためにはほとんどありません。

+0

これは機能しました。私はそのパイプを逃したとは信じられません-_- –

+0

@MichaelLaws LOLそれは実際にループのために私を投げた。私はあなたがそれを持っていたようにそれがうまくいったはずだったと思った。 –