WPF: показать и сохранить всплывающую подсказку для текстового поля на основе курсора - PullRequest
0 голосов
/ 07 мая 2011

Цель этой подсказки - показать формат строки, которую необходимо ввести.

Функции, которые я хотел бы получить:

  1. Подсказка должна отображаться, когда пользователь помещает курсор в текстовое поле, т. Е. Когда пользователь вкладывает элемент управления.
  2. Подсказка должна обновляться на основе пользовательского ввода в текстовое поле (это может быть достигнуто связыванием).
  3. Подсказка должна сохраняться до тех пор, пока пользователь не выйдет из-под контроля.

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

Спасибо

Hasanain

Ответы [ 4 ]

1 голос
/ 11 мая 2011

Используя комбинацию триггеров событий, привязок и минимального выделения кода, мне удалось реализовать поведение, которое будет обновлять всплывающую подсказку, пока пользователь вводит текстовое поле; при потере фокуса клавиатуры всплывающая подсказка исчезает.

Вот xaml для текстового поля:

<TextBox Grid.Column="0" x:Name="txtBxQckTkt" Margin="5,5,0,0" Width="250" ToolTipService.IsEnabled="True" 
                 Text="{Binding QuickTicketText}">
            <TextBox.Triggers>
                <EventTrigger RoutedEvent="TextBox.GotKeyboardFocus">
                    <BeginStoryboard>
                        <Storyboard>
                            <BooleanAnimationUsingKeyFrames
                                Storyboard.TargetName="txtBxQckTktToolTip"
                                Storyboard.TargetProperty="IsOpen">
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0"  Value="False"/>
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0.0001" Value="True" />
                            </BooleanAnimationUsingKeyFrames>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="txtBxQckTktToolTip" 
                                                           Storyboard.TargetProperty="Placement">
                                <DiscreteObjectKeyFrame Value="{x:Static PlacementMode.Bottom}"/>
                            </ObjectAnimationUsingKeyFrames>                                
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="TextBox.LostKeyboardFocus">
                    <BeginStoryboard>
                        <Storyboard>
                            <BooleanAnimationUsingKeyFrames
                                Storyboard.TargetName="txtBxQckTktToolTip"
                                Storyboard.TargetProperty="IsOpen">
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0"  Value="True"/>
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0.0001" Value="False" />
                            </BooleanAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </TextBox.Triggers>                    
            <TextBox.ToolTip>
                <ToolTip x:Name="txtBxQckTktToolTip" Placement="Bottom" Content="{Binding ToolTip}">                        
                </ToolTip>
            </TextBox.ToolTip>
        </TextBox>

Вот код позади:

txtBxQckTktToolTip.PlacementTarget = txtBxQckTkt;
        _handler = (s, e) =>
                      {
                          var viewModel = DataContext as SingleTradeEntryViewModel;
                          if (viewModel == null) return;

                          viewModel.OnKeyup.Execute(txtBxQckTkt.Text);                              
                      };

        txtBxQckTkt.KeyUp -= _handler;
        txtBxQckTkt.KeyUp += _handler; 

Когда команда (OnKeyup) выполняется, она вызывает уведомление об изменении свойства ToolTip, привязанного, как показано в xaml.

Спасибо

Хасанаин

0 голосов
/ 07 мая 2011

2 . ToolTip="{Binding Text, ElementName=textBox1, UpdateSourceTrigger=PropertyChanged}"

Здесь textBox1 - это имя вашего текстового поля, и я изменил UpdateSourceTrigger на PropertyChanged, чтобы он обновлял вашу всплывающую подсказку при вводе.

3 . ToolTipService.ShowDuration="12000"

Дайте этому свойству случайное время, которое будет достаточно длинным, чтобы удовлетворить ваши потребности.

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

ToolTip toolTip = ToolTipService.GetToolTip(textBox1) as ToolTip;
toolTip.IsOpen = true;
0 голосов
/ 10 мая 2011

Вы можете создать триггер, который устанавливает всплывающую подсказку, основываясь на том, имеет ли элемент управления фокус или нет

0 голосов
/ 07 мая 2011

Возможно, вам придется реализовать свой собственный, используя Popup Control. Вот пример XAML, с которого можно начать:

<Button Width="120" Height="30" Name="btn">    
        <Popup IsOpen="True" StaysOpen="True" PlacementTarget="{Binding ElementName=btn}" Placement="Bottom">
            <Button Width="120" Height="30" Content="Button In ToolTip"/>
        </Popup>
</Button>

А вот пример кода, с которого можно начать: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/845ffad0-4abf-4830-b206-03f7fe53f74b

...