【解決方法】WPF C# でスタックパネル ユーザー コントロールにユーザー コントロールにアクセスするにはどうすればよいですか?

プログラミングQA


A stack panel allows access from one user control to another user control but does not allow access to children of the stack panel.Rows that I add from the power_setting usercontrol inside the stackpanel won't let me access them from the Print_Setting usercontrol.From stackpanel power_setting is in UserControl

私が試したこと:

this is my code for power_setting(User Control):-

C#
private void addbtn_Click(object sender, RoutedEventArgs e)
        {
            AddNewRow();
            rowCounter++;
        }
        private void AddNewRow()
        {
            var newRow = CreateRow();
            RowsStackPanel.Children.Add(newRow);
        }
        private StackPanel CreateRow()
        {
            var row = new StackPanel { Orientation = Orientation.Horizontal };
            var textBox1 = new TextBox { HorizontalAlignment = HorizontalAlignment.Left, Height = 23, Width = 70, Margin = new Thickness(1, 5, 5, 5), TextWrapping = TextWrapping.Wrap };
           
           
            // Event handler for textBox1 TextChanged event
            textBox1.TextChanged += (sender, e) =>
            {
                // Get the textbox control
                TextBox textbox = (TextBox)sender;
                // Check if the textbox name contains an underscore
                if (textbox.Name.Contains("_"))
                {
                    // Split the textbox name to extract the unique identifier
                    string uniqueId = textbox.Name.Split('_')[1];
                    // Store the textbox data in the registry
                    mr.Write("moveXtxt_" + uniqueId, textbox.Text);
                }
            };
            row.Children.Add(textBox1);
            return row;
        }

this is my code for Print_Setting usercontrol):-	
C#
private void PrintPowersetbtn_Click(object sender, RoutedEventArgs e)
        {

            //powersetting.OnButton2Clicked();
            //MessageBox.Show("OK");
            CompareValuesWithPowerText();
        }

        public void CompareValuesWithPowerText()
        {
            int targetValue = int.Parse(STL.valpower);
            var selectedRows = FindRowsWithMatchingValue(targetValue);
        }

        private List<StackPanel> FindRowsWithMatchingValue(int targetValue)
        {
            Power_Setting powersetting = new Power_Setting();
            var selectedRows = new List<StackPanel>();
            StackPanel closestLowerRow = null;
            StackPanel closestHigherRow = null;
            int closestLowerDiff = int.MaxValue;
            int closestHigherDiff = int.MaxValue;

            foreach (var child in powersetting.RowsStackPanel.Children)
            {
               // code 
            }

            if (closestLowerRow != null)
            {
                selectedRows.Add(closestLowerRow);
            }

            if (closestHigherRow != null)
            {
                selectedRows.Add(closestHigherRow);
            }

            return selectedRows;
        }

解決策 1

新しい WPF プロジェクトを作成します。

次のクラスを追加します。

C#
internal static class PowerSettingsContext
{
    public static Func<string, string> Find { get; set; }
}

このクラスは、UserControl 内のメソッドへのデリゲート参照を保持します。 StackPanel 検索するためのコントロールを使用します。

UserControl は次のとおりです。

XML
<UserControl x:Class="WpfSharedContext.UserControl1"
             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" 
             xmlns:local="clr-namespace:WpfSharedContext"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <StackPanel x:Name="MyStackPanel" Orientation="Vertical">
            <TextBlock x:Name="TextBlock1"  Text="John"/>
            <TextBlock x:Name="TextBlock2"  Text="Paul"/>
            <TextBlock x:Name="TextBlock3"  Text="George"/>
            <TextBlock x:Name="TextBlock4"  Text="Ringo"/>
        </StackPanel>
    </Grid>
</UserControl>

そして、コードビハインド:

C#
public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
        PowerSettingsContext.Find = FindControl;
    }

    public string FindControl(string text)
    {
        foreach (TextBlock child in MyStackPanel.Children.Cast<TextBlock>())
        {
            if (child.Text.Equals(text,
                    StringComparison.InvariantCultureIgnoreCase))
                return child.Name;
        }
        return "";
    }
}

コンストラクターは共有を指します PowerSettingsContext.Find メソッドを UserControl の search メソッドに追加します。

C#
PowerSettingsContext.Find = FindControl;

これで、情報を要求する UserControl を追加できます。

XML
<UserControl x:Class="WpfSharedContext.UserControl2"
             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" 
             xmlns:local="clr-namespace:WpfSharedContext"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <StackPanel Margin="10"
                    Orientation="Horizontal"
                    Height="40">
            <TextBlock Text="Enter Value:"
                       VerticalAlignment="Center"/>
            <TextBox x:Name="SearchText" Width="100" Margin="10 0"/>
            <Button x:Name="SearchButton"
                    Padding="20 10" 
                    Content="GO!"
                    Click="SearchButton_OnClick"/>
        </StackPanel>

        <StackPanel Grid.Row="1" Margin="10" Orientation="Horizontal">
            <TextBlock Text="Result:"/>
            <TextBlock x:Name="Result" Width="100" Margin="10 0 0 0"/>
        </StackPanel>
    </Grid>
</UserControl>

そして分離コード:

C#
public partial class UserControl2 : UserControl
{
    public UserControl2()
    {
        InitializeComponent();
    }

    private void SearchButton_OnClick(object sender, RoutedEventArgs e)
    {
        Result.Text = PowerSettingsContext.Find(SearchText.Text);
    }
}

検索ボタンをクリックすると、共有されたファイルが呼び出されます。 PowerSettingsContext.Find メソッドを実行し、結果を表示します。 ここではテキストを検索し、完全に一致するコントロール名を返します。

これで、両方の UserControl をホスト (ウィンドウ) に追加できます。

XML
<Grid Margin="20">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <local:UserControl1 />
    <local:UserControl2 Grid.Row="1" />
</Grid>

ここで、UserControl1` の 4 つの名前のいずれかを使用すると、UserControl2 にはそのテキストを含むコントロール名が表示されます。 どちらの UserControl も相手のことを認識せず、共有されたもののみを認識します。 PowerSettingsContext クラス。

コメント

タイトルとURLをコピーしました