[ad_1]
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
クラス。
[ad_2]
コメント