2009-07-09 19 views
6

Birkaç pencereli bir WPF uygulamasına sahibim. GLOBAL inputBindings tanımlamak istiyorum.XAML - Global inputBindings nasıl?

LOCAL giriş belirtimlerini tanımlamak için, Window.InputBindings veya UserControl.InputBindings içindeki girdiyi bildiririm. i 2 farklı pencerelerde aynı bağlama varsa

<Application 
....> 
<Application.InputBindings> 
... 
</Application.InputBindings> 

... Ben Uygulama sınıfı ile aynı şeyi isterdim, globaller tanımlamak için, ben iki kez kod gerekiyor. Bu D.R.Y.'nin felsefesini karşılamıyor ve sanırım daha iyi bir yol var ...

DÜZENLEME: Onun cevabında Kent Boogaart Style'u kullanmamı önerir. Ne yazık ki, onu nasıl tanımlayacağımı anlayamıyorum. Hata MC3080: erişilebilir bir ayarlama erişimcisine olmadığı için özellik kurucu 'InputBindings' ayarlanamaz Bir hata yükseltir

<Application.Resources> 
    <Style TargetType="Window"> 
     <Setter Property="InputBindings"> 
      <Setter.Value> 
       <Window.InputBindings> 
        <KeyBinding KeyGesture="Ctrl+M" Command="local:App.MsgCommand /> 
       </Window.InputBindings> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Application.Resources> 

: Bu kodudur.

Stilim yanlış mı? Başka bir çözüm var mı?

Herhangi bir fikrin var mı? Teşekkürler!

cevap

9

Bir çözüm, uygulamanızdaki belirli bir türdeki tüm denetimlerde InputBindings değerini ayarlamak için Style ile Attached Property kullanmaktır. Ne yazık ki, bir "tüm" yakalamak "Style (zaten bildiğim) yapamazsınız, InputBindings ayarlamak istediğiniz her denetim türü için bir Style oluşturmanız gerekir Ancak, çok fazla kontroller). - Yukarıdaki kod kullanırken bazı çok garip sorunlar vardı

using System.Windows; 
using System.Windows.Input; 

namespace WpfApplication1 
{ 
    public class MyAttached 
    { 
     public static readonly DependencyProperty InputBindingsProperty = 
      DependencyProperty.RegisterAttached("InputBindings", typeof(InputBindingCollection), typeof(MyAttached), 
      new FrameworkPropertyMetadata(new InputBindingCollection(), 
      (sender, e) => 
      { 
       var element = sender as UIElement; 
       if (element == null) return; 
       element.InputBindings.Clear(); 
       element.InputBindings.AddRange((InputBindingCollection)e.NewValue); 
      })); 

     public static InputBindingCollection GetInputBindings(UIElement element) 
     { 
      return (InputBindingCollection)element.GetValue(InputBindingsProperty); 
     } 

     public static void SetInputBindings(UIElement element, InputBindingCollection inputBindings) 
     { 
      element.SetValue(InputBindingsProperty, inputBindings); 
     } 

    } 
} 

<Application x:Class="WpfApplication1.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:loc="clr-namespace:WpfApplication1" 
    StartupUri="Window1.xaml"> 
    <Application.Resources> 
     <Style TargetType="TextBox"> 
      <Setter Property="loc:MyAttached.InputBindings"> 
       <Setter.Value> 
        <InputBindingCollection> 
         <KeyBinding Key="A" Modifiers="Ctrl" Command="loc:Window1.MyAction" /> 
        </InputBindingCollection> 
       </Setter.Value> 
      </Setter> 
     </Style> 
     <Style TargetType="Button"> 
      <Setter Property="loc:MyAttached.InputBindings"> 
       <Setter.Value> 
        <InputBindingCollection> 
         <KeyBinding Key="A" Modifiers="Ctrl" Command="loc:Window1.MyAction" /> 
        </InputBindingCollection> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Application.Resources> 
</Application> 

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:loc="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300"> 
    <Window.CommandBindings> 
     <CommandBinding Command="loc:Window1.MyAction" Executed="MyAction_Executed" /> 
    </Window.CommandBindings> 
    <StackPanel> 
     <Button Content="Try Ctrl+A Here!" /> 
     <TextBox Text="Try Ctrl+A Here!" /> 
    </StackPanel> 
</Window> 

using System.Windows; 
using System.Windows.Input; 

namespace WpfApplication1 
{ 
    public partial class Window1 
    { 
     public static readonly RoutedUICommand MyAction = new RoutedUICommand("MyAction", "MyAction", typeof(Window1)); 

     public Window1() { InitializeComponent(); } 

     private void MyAction_Executed(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show("MyAction!"); } 
    } 
} 
+0

Dikkat: Aşağıda bunun nasıl gösterir örnek kod verilmiştir. Bir stilde uygulayana kadar harika çalıştı, o zaman rastgele durumlarda çalışacak gibi görünüyordu, ancak sonra DataContext boş olurdu (böylece komutların hiçbiri bağlanamayacaktı). Bunun neden rastgele olacağına karar veremedim. – Asheh

0

Tüm Window s ürünlerine uygulanan bir Style oluşturabilirsiniz. Bu Style, InputBindings'u ayarlayabilir.