2014-09-12 2 views
2

Я разрабатываю экранную клавиатуру для использования в приложении стиля киоска. Я строю его таким образом, что хочу, чтобы экранная клавиатура отображала предварительный просмотр любого текста, который вводит пользователь, используя клавиатуру.Как установить привязку родительского UIElement к прикрепленному свойству?

В xaml Я хочу добавить вложенное свойство для ввода элементов управления в моем приложении, например TextBox или ComboBox. Я хочу, чтобы элемент управления предварительного просмотра на моем OnScreenKeyboard был привязан к тому же значению, к которому привязан базовый элемент управления. Поэтому, если пользователь нажимает на TextBox, предварительный просмотр на экранной клавиатуре также является TextBox и также привязан к тому же базовому значению, что и TextBox, например. TextBox.Text.

On Screen Keyboard

Изображение Я Приведенную выше, как моя клавиатура будет выглядеть. Поскольку клавиатура сама по себе является всплывающей в фиксированной позиции (нижний центр экрана), клавиатура может закрывать входной элемент управления (TextBox, PasswordBox, ComboBox, RichTextBox и т. Д.), Который пользователь нажал, чтобы вызвать клавиатуру, следовательно, требование предварительного просмотра как части клавиатуры.

Я знаю, что в XAML я могу создать вложенное свойство, такие как

<TextBox Text="{Binding Path=Entity.TextValue}" OSK.PopupKeyboard.UIElementControl="{How do I bind this to this parent control?}"/> 

То, что я хотел бы сделать, это передать родительский контроль, такие как текстовое поле с клавиатуры, установите панель предварительного просмотра по извилистым верхняя часть моей клавиатуры была того же типа с теми же привязками, что и базовый элемент управления, на который пользователь нажал, чтобы вызвать клавиатуру. Таким образом, значения, введенные в предварительный просмотр на клавиатуре, отражаются на элементе управления, который пользователь щелкнул, чтобы вызвать клавиатуру в первую очередь. Я также полагаю, что это позволит клавиатуре быть гибкими с типом элементов управления, которые могут быть использованы для вызова.

+0

Вы упомянули, что эта клавиатура является неподвижной частью вашего права приложения киоска ? Значит, вы могли бы просто ссылаться на него с помощью ElementBinding? '{Binding ElementName = controlname, Path = someproperty}' Или мне что-то не хватает? –

+1

@WolfgangZiegler Вот что я хочу. Действительно, что я хочу сделать, это привязать весь TextBox, ComboBox или тому подобное к клавиатуре, чтобы окно предварительного просмотра вверху было одним и тем же типом управления с тем же значением. Я хочу избежать использования именованных элементов управления, поскольку я беру подход MVVM. Так что-то вроде {Binding this.control}, если вы понимаете, что я имею в виду? Я понимаю, что, возможно, я не объясняю это хорошо. Кроме того, ваше имя полностью напомнило мне об этом http://www.dilbert.com/strips/comic/2010-05-16/ –

+0

Ха-ха, хороший! Я дам вам преимущество для Дилберта. –

ответ

0

Итак, я выяснил, что мне нужно делать в этом случае. Мне нужно было создать свойство зависимости типа FrameworkElement. На моей экранной клавиатуре UserControl мне понадобился ContentControl для хранения типа FrameworkElement. Естественно, вам нужно отключить FrameworkElement от его исходного родителя, поскольку он не может быть в визуальном дереве более одного раза, сохранить родителя, прикрепить его к новому родительскому контенту (ContentControl), а затем, когда вы закончите, подключите его к оригиналу родитель.

public static readonly DependencyProperty FrameworkElementProperty = 
      DependencyProperty.RegisterAttached("FrameworkElement", 
      typeof(FrameworkElement), 
      typeof(PopupKeyboard), 
      new FrameworkPropertyMetadata(default(FrameworkElement), 
       new PropertyChangedCallback(PopupKeyboard.OnFrameworkElementChanged))); 

     [AttachedPropertyBrowsableForType(typeof(FrameworkElement))] 
     public static FrameworkElement GetFrameworkElement(DependencyObject element) 
     { 
      if (element == null) 
       throw new ArgumentNullException("element"); 

      return (FrameworkElement)element.GetValue(FrameworkElementProperty); 
     } 

     public static void SetFrameworkElement(DependencyObject element, bool value) 
     { 
      if (element == null) 
       throw new ArgumentNullException("element"); 

      element.SetValue(FrameworkElementProperty, value); 
     } 

private static void OnFrameworkElementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      FrameworkElement fe = d as FrameworkElement; 
      if (fe != null) 
      { 
       // detach here 
       keyboard.FrameworkElement = fe; 
      } 
     } 

Если бы я хотел, чтобы связать элемент управления, такие как TextBox, ComboBox и т.д., я хотел бы использовать разметку следующим образом:

<TextBox Content="{Binding Entity.Value}" local:PopupKeyboard.FrameworkElement="{Binding RelativeSource={RelativeSource Self}}" /> 
Смежные вопросы