テキスト ボックスとテキスト変更イベント ハンドラーが関連付けられたコントロールを作成しました。これは xaml にあります。
問題: コントロールが読み込まれると、テキスト変更イベントが発生します。コントロールが実際に何かを入力してコントロールを変更したときにのみ、コントロールが読み込まれたときに発生したくありません。
あなたのプロは私が何をすることを提案しますか? :)
処理する前に、イベント ハンドラー内でテキスト ボックスの IsLoaded プロパティを確認するだけです。
InitializeComponent
ではなく、コンストラクターの Method の後に EventHandler をアタッチしますXaml
。
すなわち
public MainWindow()
{
InitializeComponent();
textBox1.TextChanged+=new TextChangedEventHandler(textBox1_TextChanged);
}
あなたがユーザーコントロールについて話していることに気づきました。私が頭の中で考えることができる唯一のことは、親フォームの読み込みが完了するまで TextChanged イベントを禁止するために使用できるプロパティを作成することです。このようなものが機能するかどうかを確認してください。
メインフォーム Xaml:
<my:UserControl1 setInhibit="True" HorizontalAlignment="Left" Margin="111,103,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="55" Width="149" setText="Hello" />
メインフォーム CS
private void Window_Loaded(object sender, RoutedEventArgs e)
{
userControl11.setInhibit = false;
}
ユーザーコントロール:
public UserControl1()
{
InitializeComponent();
textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
}
public string setText
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
public bool setInhibit { get; set; }
void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (setInhibit) return;
// Do your work here
}
UserControl1.xaml:
<Grid>
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged"/>
</Grid>
ここで、TextChanged は TextBox の元のイベントです
UserControl1.xaml.cs:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
_isFirstTime = true;
DataContext = this;
InitializeComponent();
}
public event TextChangedEventHandler TextBoxTextChanged;
bool _isFirstTime;
//MyText Dependency Property
public string MyText
{
get { return (string)GetValue(MyTextProperty); }
set { SetValue(MyTextProperty, value); }
}
public static readonly DependencyProperty MyTextProperty =
DependencyProperty.Register("MyText", typeof(string), typeof(UserControl1), new UIPropertyMetadata(""));
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
if (TextBoxTextChanged != null)
if (!_isFirstTime)
{
TextBoxTextChanged(sender, e);
}
_isFirstTime = false;
}
}
ここで、TextBox_TextChanged は元の TextChanged のカスタマイズされた eventHandler であり、TextBoxTextChanged は元の TextChanged のラッパーに似ています
Window.xaml:
<Grid>
<c:UserControl1 TextBoxTextChanged="TextBoxValueChanged"/>
</Grid>
ご覧のとおり、eventHandler をイベント ラッパー (TextBoxTextChanged) に追加できます。
Window.xaml.cs:
private void TextBoxValueChanged(object sender, TextChangedEventArgs e)
{
MessageBox.Show("asd");
}
最終的に TextBoxValueChanged は、テキストが初めて変更されたときに発生しません