Как динамически добавить и удалить событие в wpf?
<Grid x:Name="BackSpaceButton">
<TextBox x:Name="txt_remove" Height="46" Margin="234,119,225,0" TextWrapping="Wrap" VerticalAlignment="Top" GotFocus="txt_remove_GotFocus" TabIndex="2"/>
<RepeatButton x:Name="rbtn_remove" Content="Backspace" Delay="400" Interval="200" Margin="415,124,0,0" RenderTransformOrigin="0.667,0.854" Click="rbtn_remove_Click" LostMouseCapture="rbtn_remove_LostMouseCapture" HorizontalAlignment="Left" Height="41" VerticalAlignment="Top" Width="66" TabIndex="2" />
</Grid>
Этот дизайн будет как ниже
public partial class Repeate : Window
{
Control GetTextbox;
TextBox GetInstance;
public Repeate()
{
this.InitializeComponent();
}
private void rbtn_remove_Click(object sender, RoutedEventArgs e)
{
GetInstance = GetTextbox as TextBox;
if (GetTextbox != null)
{
string _CurrentValue = GetInstance.Text;
var _CareIndex = GetInstance.CaretIndex;
if (_CareIndex > 0)
{
string _Backspace = _CurrentValue.Remove(_CareIndex - 1, 1);
GetInstance.Text = _Backspace;
// I want o remove the Gotfocus envet here.
GetInstance.Focus(); //If i comment this line cursor will not focus on textbox
GetInstance.CaretIndex = _CareIndex - 1;
}
}
}
private void txt_remove_GotFocus(object sender, RoutedEventArgs e)
{
GetTextbox = (Control)sender;
}
private void rbtn_remove_LostMouseCapture(object sender, MouseEventArgs e)
{
GetInstance.Focus();
}
}
Out put будет как ниже
Когда я нажимаю кнопку "Возврат", текстовое поле удаляется, и курсор будет фокусироваться на текстовом поле. В чем заключается проблема, когда я нажимаю и удерживаю кнопку "Возврат", значение текстового поля не удаляется повторно. Если комментарий, то GetInstance.Focus(); из приведенного выше кода значения удаляются неоднократно, но курсор не фокусируется при неоднократном удалении текстового значения в текстовом поле.
Но у меня есть идея, если удалить событие (txt_remove_GotFocus) до GetInstance.Focus(); Значения текстового поля удаляются несколько раз при нажатии и удерживании кнопки Backspace. После этого будет добавлен новый обработчик событий в rbtn_remove_LostMouseCapture envent.
Наконец, я хочу достичь сценария ниже.
Например : введите значение в текстовое поле, а затем нажмите и удерживайте клавишу возврата на системной клавиатуре, чтобы получить разницу.
Если у вас есть какие-либо другие идеи для вышеуказанного сценария, пожалуйста, поделитесь со мной.
1 ответ
Почему вы не используете класс RepeatButton?
Цитата из MSDN:
Представляет элемент управления, который повторно вызывает событие Click с момента нажатия до его отпускания.
Вот пример кода MVVM:
1) Образец вида модели:
public class ViewModel : ViewModelBase
{
public ViewModel()
{
this.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
this.backspaceCommand = new RelayCommand(
() => Text = Text.Substring(0, Text.Length - 1),
() => !String.IsNullOrEmpty(Text));
}
public String Text
{
get { return text; }
set
{
if (text != value)
{
text = value;
OnPropertyChanged("Text");
}
}
}
private String text;
public RelayCommand BackspaceCommand
{
get { return backspaceCommand; }
}
private readonly RelayCommand backspaceCommand;
}
3) Разметка окна:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="114" Width="404">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Grid.Column="0" Margin="5" x:Name="tbText" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
<RepeatButton Grid.Column="1" Margin="5" Content="Backspace" Command="{Binding BackspaceCommand}"/>
</Grid>
</Window>
3) Окно-код:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += (sender, args) =>
{
tbText.Focus();
tbText.CaretIndex = tbText.Text.Length;
};
DataContext = new ViewModel();
}
}
Вот пример уродливого кода позади:
ОБНОВИТЬ. Этот образец был обновлен, чтобы показать каретку при нажатии кнопки. Во-первых, мы должны отключить фокусировку на кнопке. Во-вторых, мы должны исправить положение каретки после текста в TextBox
был изменен.
1) Разметка Windows:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="114" Width="404">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Grid.Column="0" Margin="5" x:Name="tbText" Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit."/>
<RepeatButton Grid.Column="1" Margin="5" Focusable="False" Content="Backspace" Click="RepeatButton_Click"/>
</Grid>
</Window>
2) Окно кода:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += (sender, args) =>
{
tbText.Focus();
tbText.CaretIndex = tbText.Text.Length;
};
}
private void RepeatButton_Click(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(tbText.Text))
{
tbText.Text = tbText.Text.Substring(0, tbText.Text.Length - 1);
tbText.CaretIndex = tbText.Text.Length;
}
}
}