0
<Grid x:Name="LayoutRoot">
    <TextBox x:Name="txt_diplay_1" HorizontalAlignment="Left" Height="42" Margin="155,78,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="103.5" GotFocus="txt_diplay_1_GotFocus" />
    <TextBox x:Name="txt_diplay_2" Height="42" Margin="297,78,239.5,0" TextWrapping="Wrap" VerticalAlignment="Top" GotFocus="txt_diplay_2_GotFocus" />
    <Button x:Name="btn_a" Content="A" HorizontalAlignment="Left" Height="40" Margin="155,147,0,0" VerticalAlignment="Top" Width="73" Click="btn_a_Click" />
    <Button x:Name="btn_b" Content="B" Height="40" Margin="237,147,0,0" VerticalAlignment="Top" Click="btn_b_Click" HorizontalAlignment="Left" Width="73" />
    <Button x:Name="btn_c"  Height="40" Margin="0,147,239.5,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="73" Click="btn_c_Click" >
        <Grid Height="30.833" Width="61.5">
            <Label x:Name="lbl_1" Content="1" Margin="22.498,6.5,19.501,2.166"/>
            <Label x:Name="lbl_2" Content="!" HorizontalAlignment="Right" Margin="0,-4.422,0,13.088" Width="19.501"/>
        </Grid>
    </Button>
</Grid>

こんなデザインになります

結果

public partial class MainWindow : Window
{
    Control TexboxDetails = null;      
    Control ButtonDetails;             
    Button BehaveButton;     

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

private void btn_a_Click(object sender, RoutedEventArgs e)
    {
        ButtonDetails = (Control)sender;
        all_in_one();
    }

    private void btn_b_Click(object sender, RoutedEventArgs e)
    {
        ButtonDetails = (Control)sender;

        all_in_one();
    }

    private void btn_c_Click(object sender, RoutedEventArgs e)
    {

    }

    private void txt_diplay_1_GotFocus(object sender, RoutedEventArgs e)
    {
        TexboxDetails = (Control)sender;
    }

    private void txt_diplay_2_GotFocus(object sender, RoutedEventArgs e)
    {
        TexboxDetails = (Control)sender;
    }

    public void all_in_one()
    {
        BehaveButton = ButtonDetails as Button;
        if (TexboxDetails != null)
        {
            TextBox BehaveTextbox = TexboxDetails as TextBox;
            var caret_index = BehaveTextbox.CaretIndex;
            BehaveTextbox.Text = BehaveTextbox.Text.Insert(caret_index, BehaveButton.Content.ToString());
            BehaveTextbox.Focus();
            BehaveTextbox.CaretIndex = caret_index + 1;
        }
    }
}

上記のコードを使用すると、そのボタンをクリックするとボタン名を動的に取得できます。上の図では、1 つのボタン (btn_c) に 2 つのラベルがあります。ボタン(btn_c)をクリックすると、個別のラベル名が動的に取得されるようになりました。

4

2 に答える 2

1

次のように取得できます ( btn_cクリック ハンドラー内)。

var btn_c = (Button)sender;
Grid grid = (Grid)btn_c.Content;
Label label1 = (Label)grid.Children[0];
string name1 = label1.Name;
于 2012-07-04T03:55:17.393 に答える
0

あなたのデザイン全体は、本当にいくらかの手直しを必要とする可能性があります。次のコードを見てください: (イベント ハンドラーの数が減っていることに注意してください。これらを使用するには、XAML を変更する必要があります)。

public partial class MainWindow : Window
{
    TextBox LastFocusedTextBox;
    public MainWindow()
    {
        this.InitializeComponent();
    }

    private void btn_Click(object sender, RoutedEventArgs e)
    {
        InsertButtonContent((Button)sender);
    }

    private void txt_diplay_GotFocus(object sender, RoutedEventArgs e)
    {
        LastFocusedTextBox = (TextBox)sender;
    }

    public void InsertButtonContent(Button button)
    {
        if (LastFocusedTextBox != null)
        {
            string buttonContentString = button.Content as string;
            if (string.IsNullOrEmpty(buttonContentString))
            {
                var grid = button.Content as Grid;
                if (grid != null)
                    buttonContentString = string.Join("", grid.Children.OfType<ContentControl>().Select(x => x.Content));
            }
            var caret_index = LastFocusedTextBox.CaretIndex;
            LastFocusedTextBox.Text = LastFocusedTextBox.Text.Insert(caret_index, buttonContentString);
            LastFocusedTextBox.Focus();
            LastFocusedTextBox.CaretIndex = caret_index + buttonContentString.Length;
        }
    }
}

Buttonがフィールドに格納されるのではなく、どのようにメソッドに渡されるかに注目してください。また、クラスとall_in_one()メソッドのローカルの両方で不要なフィールドが削除されました。グリッド内のラベルの内容を取得するには (たとえば"1!"、単純な文字列フィールドには他に何も入力できず、最初の 2 つのボタンの一般的なパターンにも一致しないため、これが目的だったと思います)、それらを選択するだけです。コンテンツが文字列であるかグリッドであるかを確認した後、それらを単一の文字列に結合します。

于 2012-07-04T03:55:43.990 に答える