2016-07-25 1 views
0

私は、ほとんどのコントロールが実行時に動的に作成されるWPFアプリケーションで作業しています。いくつかのコードを保存するために、私は様々な静的コントロールを作成しました。今、私はそれの横に削除ボタンでテキストボックスコントロールを作成したいと思います。私が今立ち往生しているところは、コントロールのイベントをどうやってキャプチャするのですか? (コードを参照)derrivedクラスの汎用ボタンのイベントをキャプチャする

編集: 私はカスタムコントロールを作成しようとしました。しかし、私はカスタムイベントを動作させることはできません。私。 wpf-pageで私はそれにハンドラをフックするために、削除イベントを見つけることができません。どこで私は間違えましたか?これまでのところ、: Gridステートメントを削除すると、イベントが表示されることがわかりました。

public class tbTextReadOnlyWithDeleteButton : Grid 
{ 

    public event EventHandler Delete; 

    public tbTextReadOnlyWithDeleteButton(int gridrow, int gridcol, string feldname, object quelle, string ctlname, object tag) 
    { 
     Grid gr = new Grid() { Name = "grMit_" + gridrow + "_" + gridcol + "_" + ctlname }; 
     gr.SetValue(Grid.RowProperty, gridrow); 
     gr.SetValue(Grid.ColumnProperty, gridcol); 
     gr.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(30) }); 
     gr.ColumnDefinitions.Add(new ColumnDefinition()); 
     gr.Tag = tag; 


     Button bu = new Button() { Name = "buLoeschen" }; 
     bu.SetValue(Grid.ColumnProperty, 0); 
     bu.Margin = new Thickness(5, 5, 5, 5); 
     bu.Content = "\xE10A"; 
     bu.FontFamily = new FontFamily("Segoe MDL2 Assets"); 
     bu.FontSize = 10; 
     bu.Tag = quelle; 
     bu.Click += Bu_Click; 


     TextBox tb = new TextBox(); 
     tb.SetValue(Grid.RowProperty, 0); 
     tb.SetValue(Grid.ColumnProperty, 1); 
     tb.IsReadOnly = true; 
     tb.VerticalContentAlignment = VerticalAlignment.Center; 
     tb.HorizontalContentAlignment = HorizontalAlignment.Left; 
     tb.Background = new SolidColorBrush() { Opacity = 1 }; 
     tb.BorderThickness = new Thickness(0); 
     tb.TextWrapping = TextWrapping.Wrap; 
     BindingOperations.SetBinding(tb, TextBox.TextProperty, new Binding(feldname) { Source = quelle, Mode = BindingMode.OneWay }); 

     gr.Children.Add(bu); 
     gr.Children.Add(tb); 


    } 

    private void Bu_Click(object sender, RoutedEventArgs e) 
    { 
     Delete(sender, e); 
    } 
} 

// in the page it looks like this: 
Grid tbMit = new tbTextReadOnlyWithDeleteButton(1, 0, "Name", mit, "name", dat); 

tbMit.Delete // <-- Why can't this be found?? 

エンド編集

// Control 
    public static Grid tbTextReadOnlyWithDeleteButton(int gridrow, int gridcol, string feldname, object quelle) 
    { 
     Grid gr = new Grid(); 
     gr.SetValue(Grid.RowProperty, gridrow); 
     gr.SetValue(Grid.ColumnProperty, gridcol); 
     gr.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(30)}); 
     gr.ColumnDefinitions.Add(new ColumnDefinition()); 


     Button bu = new Button() { Name = "buDelete" }; 
     bu.SetValue(Grid.ColumnProperty, 0); 
     bu.Margin = new Thickness(5, 5, 5, 5); 
     bu.Content = "\xE10A"; 
     bu.FontFamily = new FontFamily("Segoe MDL2 Assets"); 
     bu.FontSize = 10; 
     bu.Tag = quelle; 


     TextBox tb = new TextBox(); 
     tb.SetValue(Grid.RowProperty, 0); 
     tb.SetValue(Grid.ColumnProperty, 1); 
     tb.IsReadOnly = true; 
     tb.VerticalContentAlignment = VerticalAlignment.Center; 
     tb.HorizontalContentAlignment = HorizontalAlignment.Left; 
     tb.Background = new SolidColorBrush() { Opacity = 1 }; 
     tb.BorderThickness = new Thickness(0); 
     tb.TextWrapping = TextWrapping.Wrap; 
     BindingOperations.SetBinding(tb, TextBox.TextProperty, new Binding(feldname) { Source = quelle, Mode = BindingMode.OneWay }); 

     gr.Children.Add(bu); 
     gr.Children.Add(tb); 

     return gr; 
    } 

// Usage in Code 
Grid tbMit = glCtlTextbox.tbTextReadOnlyWithDeleteButton(1, 0, "Name", mit); 
spStackpanel.Children.Add(tbMit); 

//Now I need something like this, which is not working 
tbMit.buDelete.Click += buDelete__Click; 

は誰これにアプローチする方法のヒントを持っていますか?

ありがとうございます!

+0

私があなただったら、私は細かい作品 – KANAX

答えて

1

あなたはあなたのユーザーコントロールを定義するための2つのソリューションがあります。

  • あなたの最初の例では
  • コード

の背後にあるXAMLの+のコードを、あなたはあなたをキャストしている削除の原因を発見することはできませんグリッドへのクラス。

グリッド定義には、削除イベントはありません。

あなたはこれを行う必要があります。

tbTextReadOnlyWithDeleteButton tbMit = new tbTextReadOnlyWithDeleteButton(1, 0, "Name", mit, "name", dat); 

tbMit.Delete += your_event_handler; 

は、私はあなたがアプローチの背後にあるXAML +コードを使用することをお勧めします。 (誰もコードを使用してコントロールを定義することはできません)

Visual Studioでプロジェクトの任意のフォルダをクリックし、[ユーザーコントロール]を選択します。

あなたは自動的にこれらのファイルを持っています:

  • your_control.xaml
  • your_control.xaml。CS

C#+ XAML:

のC#:

public partial class your_control : UserControl 
{ 
    public delegate void delete_event_handler(your_control sender); 
    public event delete_event_handler delete; 

    public your_control() 
    { 
     this.InitializeComponent(); 
    } 

    private void on_bu_click(object sender, RoutedEventArgs e) 
    { 
     // the event is null if there is no listeners bind to it 
     if (this.delete != null) 
      this.delete(this); 
    } 
} 

とXAML:

<UserControl x:Class="test_wpf.your_control" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="3*" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <!-- Use the FieldModifier property to define the visibility of the control outside the class--> 
    <TextBlock x:Name="tb" x:FieldModifier="private" >Your text</TextBlock> 
    <Button Grid.Column="1" x:Name="bu" x:FieldModifier="private" Click="on_bu_click">Delete</Button> 
</Grid> 

、次いで

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     your_control control = new your_control(); 
     control.delete += on_delete; 
    } 

    public void on_delete(your_control sender) 
    { 
     // your stuff 
    } 
} 

コードのみのアプローチ:

public class your_control : UserControl 
{ 

    public TextBox tb { get; private set; } 
    public Button bu { get; private set; } 
    private Grid container; 

    public your_control (/* your params*/) 
    { 
     this.tb = this.build_textbox(); 
     this.bu = this.build_button(); 
     this.container = new Grid(); 
     this.Content = this.container; 
     this.container.Children.Add(this.tb); 
     this.container.Children.Add(this.bu); 
    } 

    private TextBox build_textbox() 
    { 
     TextBox tb = new TextBox(); 
     return tb; 
    } 

    private Button build_button() 
    { 
     Button bu = new Button(); 
     return bu; 
    } 
} 

、その後:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     your_control control = new your_control(); 
     control.bu.Click += on_bu_click; 
    } 

    public void on_bu_click(object sender, EventArgs e) 
    { 
     // your stuff 
    } 
} 
+0

カスタムユーザーコントロールを作成します。忌まわしい答えをありがとうございました。私はwpfを初めて使ったので、xamlにいくつか、csにいくつかを置くのではなく、1つの場所にすべての設定を入れるのがより便利だと思った。 –

関連する問題